装饰器模式-设计模式
一.装饰者模式定义:
动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案。
模式的结构图:
二.模式包含角色 :
抽象构件类(Component):给出一个抽象的接口,用以规范准备接收附加责任的对象
具体构件类(ConcreteComponent):定义一个具体的准备接受附加责任的类,其必须实现Component接口。
装饰者类(Decorator):持有一个构件(Conponent)对象的实例,并定义一个和抽象构件一致的接口。
具体装饰者类(ConcreteDecoratator):定义给构件对象“贴上”附加责任。
三.使用场景:
I/O流,数据源包装 ,Spring 中用到的装饰器模式在类名上有两种表现:一种是类名中含有 Wrapper,另一种是类名中含有Decorator。
①.用于拓展一个类的功能或者给一个类添加附加职责
②.动态的给一个对象添加功能,这些功能可以再动态的撤销。
③.需要为一批的兄弟类进行改装或加装功能。
四.装饰模式的优缺点
优点:
1、装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。
2、通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果。
3、装饰器完全遵守开闭原则。
缺点:
1、会出现更多的代码,更多的类,增加程序复杂性。
2、动态装饰时,多层装饰时会更复杂。追踪代码更难看点
五.代码如下所示:
抽象构件角色
public interface Component { public void sampleOpreation(); }
具体构件角色:
public class ConcreteComponent implements Component { @Override public void sampleOpreation() { // TODO 完成相关的业务代码 } }
装饰角色
public class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } @Override public void sampleOpreation() { //委派给构件 component.sampleOpreation(); } }
具体装饰角色
public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } @Override public void sampleOpreation() { super.sampleOpreation(); //TODO 完成相关的业务代码 } }
public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } @Override public void sampleOpreation() { super.sampleOpreation(); //TODO 完成相关的业务代码 } }
参考网站:https://www.jianshu.com/p/d80b6b4b76fc
https://www.cnblogs.com/yssjun/p/11110013.html
郭慕荣博客园