java设计模式-装饰者模式(Decorator)

126 阅读1分钟

定义

其实就是在不改变原对象的基础上,动态给一个对象添加一些额外的职责功能。

装饰者模式都有哪些参与者

image.png 1.Component(被装饰对象的基类)
定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent(具体被装饰对象)
定义一个对象,可以给这个对象添加一些职责。
3.Decorator(装饰者抽象类)
维持一个指向Component实例的引用,并定义一个与Component接口一致的接口。
4.ConcreteDecorator(具体装饰者)
具体的装饰对象,给内部持有的具体被装饰对象,增加具体的职责。

举例说明

比如我们有一个只有基本功能的相机,后面又需要给相机添加美颜、滤镜功能。在不改变原相机功能的基础之上,我们就可以使用装饰者来实现。

拍照功能(Component)

interface Component{
    public void operation();
}

相机(ConcreteComponent)

class ConcreteComponent implements Component{
    @Override
    public void operation() {
        System.out.println("拍照");
    }
}

装饰者抽象类

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

添加美颜功能

class ConcreteDecorator extends Decorator{
    public ConcreteDecorator(Component component) {
        super(component);
    }
    @Override
    public void operation() {
        System.out.println("添加美颜功能");
        component.operation();
    }
}

添加滤镜功能

class ConcreteDecorator1 extends Decorator{
    public ConcreteDecorator1(Component component) {
        super(component);
    }
    @Override
    public void operation() {
        System.out.println("添加滤镜功能");
        component.operation();
    }
}

测试

public static void main(String[] args) {
    Component component=new ConcreteDecorator(new ConcreteComponent());
    Component component1=new ConcreteDecorator1(component);
    component1.operation();
}

执行结果

image.png

总结

动态地将责任附加到对象上。想要扩展功能, 装饰者提供有别于继承的另一种选择。