装饰模式概念
属于结构型模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
装饰模式是利用setComponent来对对象进行包装,这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰独享只关心自己的功能,不需要关心如何被添加到对象链当中。
如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类
装饰模式是为已有功能动态地添加更多功能的一种方式。装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择地按顺序地使用装饰功能包装对象。
优点
1.把类中的装饰功能从类中去除,简化原有的类
2.有效地把类的核心职责和装饰功能分开,还可去除相关类中重复的装饰逻辑
缺点
1.多重装饰比较复杂
实例
Component
ConcreteComponent
Decorator
装饰抽象类中的操作方法中被调用的对象是我们setComponent方法传入的对象,在客户端我们通过setComponent方法传入一个正在被装饰的对象,当对上一个对象装饰完毕后,上一个对象便作为下一个装饰类setComponent的参数传入进行装饰,从而形成一条装饰对象链。
ConcreteDecoratorA
ConcreteDecoratorB
Client
首先用ConcreteComponent实例化对象,然后用A对象包装component对象,B对象再包装A对象,最后调用B对象的Operation方法。
结果
我的想法
其实我们可以把装饰者类和被装饰者类看成同一种类型的类,因为装饰者和被装饰者的实例都继承了Component,但是它们之间承担了不一样的任务,被装饰者类在代码中只能够被装饰,而装饰者类既可以装饰别人也可以被继续装饰。
从上面的例子我们可以看出装饰者中的Operation方法会调用父类的Operation方法,而父类的Operation方法则是调用setComponent传入的对象的Operation方法,也就是被装饰者中的Operation方法。依靠这条链式调用来不停装饰。