五个角色:部件(Component)、具体部件(ConcreteComponent)、装饰抽象类(Decorator)、具体装饰对象(ConcreteDecorator)、客户端(Client)
部件(Component):定义对象的接口,可以给对象动态增加职责。
具体部件(ConcreteComponent):实现对象。
装饰抽象类(Decorator):维护一个部件的实例,并且提供一个和部件相同的接口以使用。
具体装饰对象(ConcreteDecorator):实现装饰效果,增加职责。
客户端(Client):使用装饰包围部件,让部件增加功能。
实现思路:根据部件的需要动态的为部件增加职责功能。
类图:
应用场景:做四川菜,做广东菜。
分析:在本实例中设置做四川菜还需要一个汤,一盘水果,做广东菜的时候需要一个汤还需要蘸酱,不需要水果。
下面我们在控制台程序去演示一下如何使用Decorator Pattern:
一、部件(Component)
- //部件(Component)
- public abstract class Cooking
- {
- public abstract void Cook();
- }
二、具体部件(ConcreteComponent)
- //具体部件(ConcreteComponent)
- public class SichuanFood : Cooking
- {
- public override void Cook()
- {
- Console.WriteLine("炒川菜");
- }
- }
- //具体部件(ConcreteComponent)
- public class GuangdongFood : Cooking
- {
- public override void Cook()
- {
- Console.WriteLine("炒广东菜");
- }
- }
三、装饰抽象类(Decorator)
- //装饰抽象类(Decorator)
- abstract class Decorator : Cooking
- {
- protected Cooking cooking;
- public Decorator(Cooking cook)
- {
- this.cooking = cook;
- }
- public override void Cook()
- {
- cooking.Cook();
- }
- }
四、具体装饰对象(ConcreteDecorator)
- //具体装饰对象(ConcreteDecorator)
- class Soup : Decorator
- {
- public Soup(Cooking cook):base(cook)
- {
- }
- public override void Cook()
- {
- base.Cook();
- Console.WriteLine("加做一个汤");
- }
- }
- //具体装饰对象(ConcreteDecorator)
- class Fruit : Decorator
- {
- public Fruit(Cooking cook)
- : base(cook)
- {
- }
- public override void Cook()
- {
- base.Cook();
- Console.WriteLine("再加一盘水果");
- }
- }
- //具体装饰对象(ConcreteDecorator)
- class Sauce : Decorator
- {
- public Sauce(Cooking cook)
- : base(cook)
- {
- }
- public override void Cook()
- {
- base.Cook();
- Console.WriteLine("再加一碟酱汁");
- }
- }
五、客户端(Client)
- //客户端(Client)
- class Program
- {
- static void Main(string[] args)
- {
- Cooking sichuan = new SichuanFood();
- Decorator corator = new Soup(sichuan);
- Decorator fruit = new Fruit(corator);
- fruit.Cook();
- Console.WriteLine("-----------------------------");
- Cooking guangdong = new GuangdongFood();
- Decorator soup = new Soup(guangdong);
- Decorator sauce = new Sauce(soup);
- sauce.Cook();
- Console.ReadLine();
- }
- }
如需源码请点击 DecoratorPattern.rar 下载。
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827092