180 likes | 373 Views
Шаблони за дизайн със C#. Обвивка ( Wrapper). http://www.devbg.org/patternscourse/. Стефан Захариев. stephan.zahariev[at]gmail.com. NearSoft Europe www.nearsoft.ch. Необходими знания. Базови познания за езика C# Познания по ООП Базови познания по UML ( клас диаграми). Съдържание.
E N D
Шаблони задизайн със C# Обвивка(Wrapper) http://www.devbg.org/patternscourse/ Стефан Захариев stephan.zahariev[at]gmail.com NearSoft Europe www.nearsoft.ch
Необходими знания • Базови познания за езика C# • Познания по ООП • Базови познания по UML (клас диаграми)
Съдържание • Накратко за шаблона • Проблем • Структура на шаблона • Примерна реализация • Демонстрация • Въпроси при реализацията • За и против шаблона • Упражнения
Накратко за шаблона • Динамично добавяне на функционалност към даден обект • Функционалността се добавя така към обекта, че той не разбира за това • Шаблонът представлява алтернатива на създаването на подкласове при разширяване на функционалността • Познат е още като Декоратор (Decorator)
Проблем • Нека да се опитаме да реализираме текстообработваща система • Системата трябва да има прозорец, който показва текст • Прозореца, който показва текст трябва да има възможност да бъде ограждан в рамка • Ако текста излиза извън прозореца, трябва да имаме възможност за скролиране в него
Как да реализираме системата • Създаваме следните класове Не правете така
Роля на класовете • Component • Базов клас, предоставящ общ интерфейс • BorderWrapper • Обвивка, която реализира рамка • ScrollWrapper • Обвивка, която реализира скролиране • TextView • Реализира текстов прозорец
Примерна реализация abstract class Component { public abstract void Draw(); } class TextView: Component { public override void Draw() { Console.WriteLine("TextView.Draw()"); } } (примерът продължава)
Примерна реализация class ScrollDecorator: Component { private Component decoratedComponent; public ScrollDecorator(Component component) { decoratedComponent = component; } public override void Draw() { Console.WriteLine("ScrollDecorator.Draw()"); decoratedComponent.Draw(); } } (примерът продължава)
Примерна реализация class BorderDecorator : Component { private Component decoratedComponent; public BorderDecorator(Component component) { decoratedComponent = component; } public override void Draw() { Console.WriteLine("BorderDecorator.Draw()"); decoratedComponent.Draw(); } } (примерът продължава)
Примерна реализация static void Main(string[] args) { TextView text = new TextView(); ScrollDecorator scroll = new ScrollDecorator(text); BorderDecorator border = new BorderDecorator(scroll); Component component = border; component.Draw(); } Резултат: BorderDecorator.Draw() ScrollDecorator.Draw() TextView.Draw()
Демонстрация #1 • Приложение на шаблона Обвивка в текстообработваща система
Въпроси при реализацията • Интерфейса на декорирания обект трябва да отговаря на интерфейса, който декорираме • Поддържайте интерфейса на класа Component лек, защото декорацията ще бъде много трудна • Ако интерфейса на класа Component е тежък, помислете за прилагането на шаблона Стратегия
За и против шаблона • Предомства • Предоставя възможност за динамично даване/отнемане на задължения • Възлагането на задължения е по-гъвкаво спрямо наследяването • Избягва претоварването на класовете в ярархията с прекалена функционалност • Недостатъци • От гледна точка на клиента, обвивката и обвития компонент не са идентични • Прекаленото прилагане на шаблона Обвивка може да доведе до множество малки класове • Новите разработчици навлизат трудно • Затруднено дебъгване
Обвивка (Wrapper) Въпроси?
Упражнения • Кога се прилага шаблона Обвивка? • Каква е ролята на всеки от класовете участващи в шаблона? • Кои са предимствата от прилагането на шаблона Обвивка? • До какви нежелани ефекти може да доведе шаблона Обвивка?
Използвана литература • Ерик Гама, Ричард Хелм, Ралф Джонсън, Джон Влисидес, Шаблони за дизайн, СофтПрес, 2005, ISBN 954-685-352-6 • Мартин Фаулър, UML. Основи, СофтПрес, 2004, ISDN 954-685-306-2