定义
其实就是在不改变原对象的基础上,动态给一个对象添加一些额外的职责功能。
装饰者模式都有哪些参与者
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();
}
执行结果
总结
动态地将责任附加到对象上。想要扩展功能, 装饰者提供有别于继承的另一种选择。