文章目录
查看设计模式目录:https://blog.csdn.net/qq_52681418/article/details/114828850
设计模式-装饰者模式
创建一个包装类装饰现有类,在不改变原有类的情况下扩展该类,比生成子类更灵活。
IO 流使用的就是装饰者模式。
现在假设你有一个物品,你来使用装饰者模式为其装饰上颜色:
为了表明装饰器可装饰物品,装饰器、物品都继承一个父接口。
public interface ParentInterFace { void show(); }
1.你的物品
public class Goods implements ParentInterFace {
public void show() {
System.out.println("这是一个无色物品");
}
}
2.你的抽象装饰器,它能够对物品装饰
为什么物品是接口类型而不是Goods呢,因为你的物品可能不止一种,抽象装饰器表明它可以装饰了。
public class Decker implements ParentInterFace {
protected ParentInterFace goods;
//传入目标类
public Decker(ParentInterFace goods) {
this.goods= goods;
}
//装饰的方法,此处不装饰,在子类中实际装饰
public void show() {
goods.show();
}
}
3.你的实际装饰器(2个)
1.绿色装饰器
public class DeckerGreen extends Decker{ public DeckerGreen(ParentInterFace shape) { super(shape); } @Override //实际装饰 public void show() { super.show(); System.out.println("---装饰绿色---"); } }
2.红色装饰器
public class DeckerRed extends Decker { public DeckerRed(ParentInterFace goods) { super(goods); } @Override //实际装饰 public void show() { goods.show(); System.out.println("---装饰红色---"); } }
开始装饰
public class Main {
public static void main(String[] args) {
ParentInterFace goods1 = new Goods(); //创建一个物品
ParentInterFace goods2 = new DeckerRed(goods1); //装饰红色
ParentInterFace goods = new DeckerGreen(goods2); //装饰绿色
goods.show();//输出结果
}
}
装饰结果
装饰者模式和代理模式相似。