设计模式(四)装饰者模式

2019-06-23  本文已影响0人  天色将变
定义

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供类比继承更有弹性的替代方案。

解决的问题

在不修改底层代码的情况下,给对象赋予新的职责。

使用到的原则
类图
image.png
描述
伪代码

被装饰者

public abstract class ClassA{
  String attr = "default str";
  public String get Attr(){
    return attr;
  }
  public abstract int getValue();
}
public class ClassB extends ClassA{
  public ClassB(){
    attr = "classb";
  }
  public int getValue(){
    return 1;
  }
}
public class ClassC extends ClassA{
  public ClassC(){
    attr = "classc";
  }
  public int getValue(){
    return 2;
  }
}

装饰者

public abstract class ADecorator{
  public abstract String getAttr();
}
public class ClassE extends ADecorator{
  ClassA classa;
  public ClassE(ClassA a){
    this.classa = a;
  }
  public String getAttr(){
    return a.getAttr()+"classe";// 被装饰者的行为+自己的行为
  }
  public int getValue(){
    return a.getValue()+4;// 被装饰者的行为+自己的行为
  }
}
public class ClassD extends ADecorator{
  ClassA classa; // 这里是关键,增加类被装饰者的引用
  public ClassD(ClassA a){
    this.classa = a;
  }
  public String getAttr(){
    return a.getAttr()+"classd";// 被装饰者的行为+自己的行为
  }
  public int getValue(){
    return a.getValue()+5;// 被装饰者的行为+自己的行为
  }
}

示例

ClassA ca = new ClassB();
System.out.println(ca.getAttr()+ca.getValue());

//对ca对象附加功能
ClassA ca1 = new ClassB();// 面向接口编程,依然使用原来的功能
ca1 = new ClassE(ca1);// 在**ca1对象**的基础上**附加类ClassE**的功能
ca1 = new ClassD(ca1);// 又增加类ClassD的功能
System.out.println(ca1.getAttr()+ca1.getValue());
一句话总结

继承它,使用它,扩展它

上一篇 下一篇

猜你喜欢

热点阅读