装饰模式

装饰模式可以在不创造更多子类的情况下讲对象的功能加以扩展

角色

  • 抽象构建角色:一个接口或抽象类,规范准备接受附加责任的对象(即具体构建角色)
  • 具体构建角色: 具体的,可以被装饰
  • 装饰角色:持有一个抽检构建的引用,已原逻辑实现抽闲构建角色的方法。
  • 具体装饰角色:可以装饰构建角色,也可以被装饰

UML类图

装饰角色持有构建角色引用,而且装饰角色中的方法和构建角色中的想用,实现方法使用构建角色引用对应的方法,及调用构建角色原本的实现方法
具体装饰角色在重写方法时,再增加功能。

javaIO 就是使用装饰模式。

代码示例

  • 抽象构建角色:
public interface Component {
    void doSomething();
}

  • 具体构建角色:
public class ConcreteComponent implements Component{
    @Override
    public void doSomething() {
        System.out.println("具体构建角色的功能");
    }
}
  • 装饰角色:
public class Decorator implements Component{
    private Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void doSomething() {
        component.doSomething();
    }
}
  • 具体装饰角色(两个):
public class ConcreteDecorator1 extends Decorator{
    public ConcreteDecorator1(Component component) {
        super(component);
    }

    @Override
    public void doSomething() {
        super.doSomething();
        this.doAnotherThing();
    }

    private void doAnotherThing(){
        System.out.println("具体装饰角色1的功能");
    }
}
public class ConcreteDecorator2 extends Decorator {
    public ConcreteDecorator2(Component component) {
        super(component);
    }

    @Override
    public void doSomething() {
        super.doSomething();
        this.doAnotherThing();
    }

    private void doAnotherThing(){
        System.out.println("具体装饰角色2的功能");
    }
}
  • 调用:
public class Client {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();

        Component component2 = new ConcreteDecorator1(component);

        Component component3 = new ConcreteDecorator2(component2);

        component3.doSomething();
    }
}
posted @ 2018-03-08 11:24  The_shy  阅读(117)  评论(0编辑  收藏  举报