一、装饰模式简介(Brief Introduction)
装饰模式(Decorator)动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
优点:把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。
二、装饰模式分析(Analysis)
自己的理解:
Component给出一个抽象接口,以规范准备接收附加责任的对象和抽象装饰器。
ConcreteComponent:定了一个具体的对象,用来接收附加功能的类
Decorator:持有Component对象的实例,以用它进行装饰,并定义一个与抽象构件接口一致的接口,但对于Component来说,是无需知道Decorator的存在。
ConcreteDecorator:是具体的装饰对象,起到给Component添加职责的功能。
说明:
Decorator与Component之间既是Is a...的继承关系,又是Has a...的组合关系。使用具体装饰类(ConcreteDecorator)来装饰具体构件对象(ConcreteComponent),装饰完的对象依 旧是个Component类型。
Decorator模式解决的是类的功能的多向扩展,而不是单纯的类的继承。
Decorator模式提供了比继承更灵活的功能扩展,通过使用不同具体装饰对构件对象的排列组合地包装,能够不同功能的组合。
例子:
一个画可以挂在墙上,但通常我们会把这张画镶上画框,蒙上玻璃,然后再挂在墙上。这里的画框和玻璃就是对画的装饰,装饰后成为一个物体,后来实际挂在墙上的是画框。
三.案例分析(Example)
1.Component类
//Component类 : 定义了具体构件和抽象装饰要实现的方法 abstract class Component { public abstract void Operation(); }
2.ConcreteComponent类
//ConcreteComponent类 :用来继承Component抽象类,实现它的Operation()方法 class ConcreteComponent : Component { public override void Operation() { Console.WriteLine ("具体对象的操作"); } }
3.Decorator类
//Decorator类 :抽象装饰者也实现了抽象构件的接口 abstract class Decorator : Component { // //把一个抽象构件作为抽象装饰的成员变量。 protected Component component; //在抽象装饰者的构造函数中为抽象构件初始化。 public void SetComponent(Componentcomponent) { this.component = component; } public override void Operation() { if (component != null) { component.Operation(); } } }
4.ConcreteDecoratorA类
//ConcreteDecoratorA类 class ConcreteDecoratorA : Decorator { private string AddedState; public override void Operation() { base.Operation(); //首先运行原Compnent的Operation(),再执行本类的功能,如AddedBehavior,相当于对原Component进行了装饰 AddedState ="New State"; //本类独有的方法 Console.WriteLine("具体装饰对象A的操作"); } }
5.ConcreteDecoratorB类
class ConcreteDecoratorB : Decorator { public override void Operation() { base.Operation(); //首先运行原Compnent的Operation(),再执行本类的功能,如AddedBehavior,相当于对原Component进行了装饰 AddedBehavior(); //本类独有的方法,以区别于ConcreteDecoratorA Console.WriteLine("具体装饰对象B的操作"); } public void AddedBehavior() { } }
5.客户端代码
//客户端代码 static void Main(string[] args) { ConcreteComponent c = newConcreteComponent(); //需要添加功能的对象 ConcreteDecoratorA d1 = newConcreteDecoratorA(); //装饰职能d1 ConcreteDecoratorB d2= newConcreteDecoratorB(); //装饰职能d2 d1.SetComponent(c); //装饰的方法是:首先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c,再用ConcreteDecoratorB的对象d2包装d1,最终执行d2的Operation() d2.SetComponent(d1) d2.Operation(); Console.Read(); }
四、解决的问题(What To Solve)
已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承。
比如,刚买一辆汽车如下图
此汽车不符合你的个性要求,比如外表不够美观,发动机马力不足,不能满足你的速度激情,于是你需要对汽车的外表进行装饰,同时需要提高发动机的性能。这些操作通过装饰模式就能很好地解决问题。最终得到如下图所示的个性汽车。
例子:我们想在各方面改善我们的机房收费系统,我们可以为其添加导出excel表、导出报表、动态连接等功能。
设计模式(三)—装饰模式(结构型)
最新推荐文章于 2024-06-09 23:31:02 发布