装饰器模式

Posted _Doing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器模式相关的知识,希望对你有一定的参考价值。

 
装饰器模式
  • 何时使用保持接口,增强性能为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀,在不想增加很多子类的情况下扩展类,动态地给一个对象添加一些额外的职责,可以使用装饰器模式。特点:不改变原类文件、不使用继承、动态扩展
  • 如何解决将具体功能职责划分,同时地继承装饰者模式。 1、Component 类充当抽象角色(被修饰类的抽象父类,为了易于扩展,不应该具体实现)。 2、修饰类继承Component抽象类引用Component抽象类的实现类具体扩展类重写父类(Component)方法引用:从引用的Component实现类对象中获得Component实现类(被修饰类)的方法;继承:在父类(Component抽象类)的接口下重写扩展新的修饰功能。总结:修饰类继承被修饰对象的抽象父类,依赖被修饰对象的实例(被修饰对象依赖注入),以实现接口扩展
  • 优点:1、装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。2、就增加功能来说,装饰器模式相比生成子类更为灵活。允许向一个现有的对象添加新的功能,同时又不改变其结构
  • 缺点:多层装饰比较复杂。
  • 使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。3、代替继承
典型框架
这个类图只是装饰器模式的完整结构,但其实里面有很多可以变化的地方,如:
1,Component接口可以是接口也可以是抽象类,甚至是一个普通的父类(这个强烈不推荐,普通的类作为继承体系的超级父类不易于维护)。
2,装饰器的抽象父类Decorator并不是必须的。
 
待装饰的接口Component:
  1. public interface Component{ 
  2.     void method(); 
  3. }  
待装饰类:
  1. publicclassConcreteComponent implements Component{ 
  2.  
  3.     publicvoid method(){ 
  4.         System.out.println("原来的方法"); 
  5.     } 
  6.  
  7. }  
抽象装饰器父类,它主要是为装饰器定义我们需要装饰的目标是什么,并对Component进行了基础的装饰:
  1. public abstract classDecorator implements Component{ 
  2.  
  3.     protectedComponent component; 
  4.  
  5.     publicDecorator(Component component){ 
  6.         super(); 
  7.         this.component = component; 
  8.     } 
  9.  
  10.     publicvoid method(){ 
  11.         component.method(); 
  12.     } 
  13.  
  14. } 
具体的装饰器A和装饰器B: 
  1. publicclassConcreteDecoratorA extends Decorator{ 
  2.  
  3.     publicConcreteDecoratorA(Component component){ 
  4.         super(component); 
  5.     } 
  6.  
  7.     publicvoid methodA(){ 
  8.         System.out.println("被装饰器A扩展的功能"); 
  9.     } 
  10.  
  11.     publicvoid method(){ 
  12.         System.out.println("针对该方法加一层A包装"); 
  13.         super.method(); 
  14.         System.out.println("A包装结束"); 
  15.     } 
  16. }  
 
  1. publicclassConcreteDecoratorB extends Decorator{ 
  2.  
  3.     publicConcreteDecoratorB(Component component){ 
  4.         super(component); 
  5.     } 
  6.  
  7.     publicvoid methodB(){ 
  8.         System.out.println("被装饰器B扩展的功能"); 
  9.     } 
  10.  
  11.     publicvoid method(){ 
  12.         System.out.println("针对该方法加一层B包装"); 
  13.         super.method(); 
  14.         System.out.println("B包装结束"); 
  15.     } 
  16. }
 
  1. publicclassMain{ 
  2.  
  3.     publicstaticvoid main(String[] args){ 
  4.         Component component =newConcreteComponent();    //原来的对象 
  5.         component.method();    //原来的方法 
  6.         ConcreteDecoratorA concreteDecoratorA =newConcreteDecoratorA(component);    //装饰成A 
  7.         concreteDecoratorA.method();    //原来的方法 
  8.         concreteDecoratorA.methodA();    //装饰成A以后新增的方法 
  9.         ConcreteDecoratorB concreteDecoratorB =newConcreteDecoratorB(concreteDecoratorA);//装饰成A以后再装饰成B 
  10.         concreteDecoratorB.method();    //原来的方法 
  11.         concreteDecoratorB.methodB();    //装饰成B以后新增的方法 
  12.     } 
  13. }  
 
JAVA IO中的装饰器模式
 
 
参考文章:
http://chenhua-1984.iteye.com/blog/565629 (层层修饰的装饰器模式)
 
 
 
 
 





以上是关于装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之装饰器模式

装饰器模式问题 - 如何调用嵌套装饰器方法?

学习设计模式之装饰器模式

装饰器模式

PHP 装饰器模式

设计模式之装饰器模式