装饰者模式

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

类图

  • Component:装饰者和被装饰者实现的公共接口
  • ConcreteComponent:被装饰者,可以单独使用,也可以被装饰者包装之后使用
  • Decorator:装饰者继承的抽象类,持有被装饰者的引用
  • ConcreteDecorator:实际的装饰者,可以有自己的方法,也可以扩展装饰者的状态

代码示例

//类图中的Component
public interface House {
    void layout();
}

//类图中的ConcreteComponent
public class Villa implements House{
    @Override
    public void layout() {
        System.out.println("这是一栋别墅!");
    }
}

//类图中的ConcreteComponent
public class GardenHouse implements House{
    @Override
    public void layout() {
        System.out.println("这是一套花园洋房!");
    }
}

//类图中的Decorator
public abstract class FinishingMaterial implements House {
    protected House house;
    public FinishingMaterial(House house){
        this.house=house;
    }

    @Override
    public void layout() {
        house.layout();
    }
}

//类图中的ConcreteDecorator
public class Window extends FinishingMaterial {

    public Window(House house) {
        super(house);
    }

    @Override
    public void layout() {
        super.layout();
        System.out.println("加上一扇窗");
    }
}

//类图中的ConcreteDecorator
public class Door extends FinishingMaterial {
    public Door(House house) {
        super(house);
    }

    @Override
    public void layout() {
        super.layout();
        System.out.println("加上一道门!");
    }
}

测试

public class DecoratorTestDemo {
    public static void main(String[] args){
        House gardenHouse = new GardenHouse();
        gardenHouse = new Door(gardenHouse);
        gardenHouse = new Window(gardenHouse);
        gardenHouse.layout();

        House villa = new Villa();
        villa = new Window(new Door(villa));
        villa.layout();
    }
}

 

运行结果

 

 

jdk中的装饰者模式

 其他

  • 被装饰者可以独立使用
  • 装饰者可以在运行时给被装饰者附加功能
posted @ 2020-02-19 17:16  Camcay  阅读(121)  评论(0)    收藏  举报