Java设计模式之装饰器模式

来源:互联网 发布:win10虚拟机装mac 编辑:程序博客网 时间:2024/06/13 15:56

装饰器模式结构:

Component:抽象构件

ConcreteComponent:具体构件

Decorator:抽象装饰类

ConcreteDecorator:具体装饰类


UML图:



例子代码:



抽象构件

public interface Component {    void operation1();    void operation2();}


具体构件

public class ConcreteComponent implements Component {    @Override    public void operation1() {        System.out.println("被装饰者自带方法一");    }    @Override    public void operation2() {        System.out.println("被装饰者自带方法二");    }}


抽象装饰类

public abstract class Decorator implements Component{    private Component component;    public Decorator(Component component) {        this.component = component;    }    public void operation1(){        component.operation1();    }    @Override    public void operation2() {        component.operation2();    }}


具体装饰类A
public class ConcreteDecoratorA extends Decorator {    public ConcreteDecoratorA(Component component) {        super(component);    }    public void addBehavior1(){        System.out.println("装饰器A装饰方法一");    }    public void addBehavior2(){        System.out.println("装饰器A装饰方法二");    }    @Override    public void operation1() {        super.operation1();        addBehavior1();    }    @Override    public void operation2() {        super.operation2();        addBehavior2();    }}


具体装饰类B
public class ConcreteDecoratorB extends Decorator {    public ConcreteDecoratorB(Component component) {        super(component);    }    public void addBehavior1(){        System.out.println("装饰器B装饰方法一");    }    public void addBehavior2(){        System.out.println("装饰器B装饰方法二");    }    @Override    public void operation1() {        super.operation1();        addBehavior1();    }    @Override    public void operation2() {        super.operation2();        addBehavior2();    }}
客户端
public class Client {    public static void main(String[] args) {        Component component = new ConcreteComponent();        Decorator decorator = new ConcreteDecoratorA(new ConcreteDecoratorB(component));        decorator.operation1();        decorator.operation2();    }}

结果打印:



0 0