装饰模式

装饰模式,也称为包装模式,结构型设计模式之一

定义

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活

使用场景

需要透明且动态的扩展类的功能时

简单实现

抽象组件类:

1
2
3
4
5
6
package DecorationMode;
 
//抽象组件类
public abstract class Component {
    public abstract void operate();
}

组件具体实现类

1
2
3
4
5
6
7
8
package DecorationMode;
 
//组件具体实现类
public class ConcreteComponent extends Component {
    public void operate() {
        System.out.println("具体逻辑执行内容");
    }
}

抽象装饰者

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package DecorationMode;
 
//抽象装饰者
public class Decorator extends Component {
    private Component component;
 
    public Decorator(Component component) {
        this.component = component;
    }
 
    public void operate() {
        component.operate();
    }
}

装饰者具体实现类A:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package DecorationMode;
 
public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }
 
    @Override
    public void operate() {
        operateA();
        super.operate();
    }
 
    public void operateA(){
        //装饰方法逻辑
        System.out.println("装饰方法罗技");
    }
}

装饰者具体实现类B:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package DecorationMode;
 
public class ConcreteDecoratorB extends Decorator {
 
    public ConcreteDecoratorB(Component component) {
        super(component);
    }
    @Override
    public void operate() {
        opearteB();
        super.operate();
    }
 
    public void opearteB(){
        System.out.println("自定义的装饰方法B");
    }
}

测试类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package DecorationMode;
 
//程序测试类
public class Client {
    public static void main(String[] args) {
        //构造被装饰的组件对象
        Component component=new ConcreteComponent();
 
        //根据组件对象构造装饰者对象A并调用 此时相当于给组件对象增加装饰者A的功能方法
        Decorator decorator=new ConcreteDecoratorA(component);
        decorator.operate();
 
        Decorator decorator1=new ConcreteDecoratorB(component);
        decorator1.operate();
    }
}

输出结果

255.png

总结

装饰模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案