装饰模式
装饰模式,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
我们来看基本的代码实现:
Component类:
1 package decorator; 2 3 public abstract class Componnent { 4 public abstract void operation(); 5 }
ConcreatComponent类:
1 public class ConcreatComponent extends Componnent{ 2 3 @Override 4 public void operation() { 5 System.out.println("具体对象的操作"); 6 } 7 8 }
Decorator类:
1 public abstract class Decorator extends Componnent{ 2 3 protected Componnent componnent; 4 5 6 7 @Override 8 public void operation() { 9 if(componnent != null){ 10 componnent.operation(); 11 } 12 } 13 14 15 16 public void setComponnent(Componnent componnent) { 17 this.componnent = componnent; 18 } 19 20 }
DecoratorA类:
1 public class DecoratorA extends Decorator{ 2 3 private String addState; 4 5 @Override 6 public void operation() { 7 super.operation(); 8 addState = "i am a "; 9 System.out.println("具体对象A的操作"); 10 } 11 12 }
DecoratorB类:
1 public class DecoratorB extends Decorator{ 2 3 @Override 4 public void operation() { 5 super.operation(); 6 addBehavior(); 7 } 8 9 private void addBehavior(){ 10 System.out.println("具体对象B的操作"); 11 } 12 13 }
客户端调用:
1 public class MainClass { 2 public static void main(String[] args) { 3 ConcreatComponent concreatComponent = new ConcreatComponent(); 4 DecoratorA decoratorA = new DecoratorA(); 5 DecoratorB decoratorB = new DecoratorB(); 6 7 decoratorA.setComponnent(concreatComponent); 8 decoratorB.setComponnent(decoratorA); 9 10 decoratorB.operation(); 11 } 12 }
装饰者模式的应用场景:
1、 想透明并且动态地给对象增加新的职责的时候。
2、 给对象增加的职责,在未来存在增加或减少可能。
3、 用继承扩展功能不太现实的情况下,应该考虑用组合的方式。
装饰者模式的优点:
1、 通过组合而非继承的方式,实现了动态扩展对象的功能的能力。
2、 有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
3、 充分利用了继承和组合的长处和短处,在灵活性和扩展性之间找到完美的平衡点。
4、 装饰者和被装饰者之间虽然都是同一类型,但是它们彼此是完全独立并可以各自独立任意改变的。
5、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
装饰者模式的缺点:
1、 装饰链不能过长,否则会影响效率。
2、 因为所有对象都是Component,所以如果Component内部结构发生改变,则不可避免地影响所有子类(装饰者和被装饰者),也就是说,通过继承建立的关系总是脆弱地,如果基类改变,势必影响对象的内部,而通过组合(Decoator HAS A Component)建立的关系只会影响被装饰对象的外部特征。
3、只在必要的时候使用装饰者模式,否则会提高程序的复杂性,增加系统维护难度。
每天都要对自己清零,每天都要进步,哪怕只有一点点