装饰模式:允许向一个现有对象动态添加新功能,同时不改变结构,属于JavaSE 23种设计模式中的结构型设计模型
用途:动态扩展功能
优点:装饰类和被装饰类可以独立发展,不会相互耦合
缺点:多层装饰比较复杂
编码实现 :需要4种角色
被装饰方抽象角色
public interface IShape{
void draw(); //public abstract,不是默认package
}
具体的装饰方实现,可以有多个不同实现类
public class Circle implemenets IShape{
public void draw(){
System.out.println("画了一个圆圈");
}
}
装饰抽象角色
public abstract class DecorateShape implements IShape {
private IShape target;// 被装饰方对象,就是需要动态追加功能的对象
public DecodateShape(IShape target){
this.target=target;
}
public void draw() {
target.draw(); // 具体的操作需要通过被装饰方提供实现
}
}
具体装饰角色
public class RedDecorateShape extends DecorateShape {
public RedDecorateShape(IShape target) {
super(target);
}
public void draw() {
System.out.println("使用红色");
super.draw(); // 调用父类中的被覆盖的方法
System.out.println("恢复默认的颜色");
}
}
测试类
//调用时进行组装
IShape circle=new Circle(); //节点流
IShape decorate=new RedDecorateShape(circle); //过滤流
decorate.draw();
//也允许这样使用
IShape decorate2=new BlueDecorateShape(decorate);