- 模式定义
在不改变原有对象的基础上,将功能附加到对象上
- 应用场景
扩展一个类的功能或给一个类添加附加职责
- 优点
1.不改变原有对象的情况下给一个对象扩展功能
2.使用不同的组合可以实现不同的效果
3.符合开闭原则
示例:我们创建一个拍照接口进行实现,实现后我们需要新加一个美颜效果
public class DecoratorTest { public static void main(String[] args) { Component component = new ConCreateDecorator1(new ConcreateComponent()); component.operation(); } } interface Component{ void operation(); } class ConcreateComponent implements Component{ @Override public void operation() { System.out.println("拍照。。。。"); } } abstract class Decorator implements Component{ Component component; public Decorator(Component component) { this.component = component; } } class ConCreateDecorator1 extends Decorator{ public ConCreateDecorator1(Component component) { super(component); } @Override public void operation() { System.out.println("添加美颜效果"); component.operation(); } }
运行结果
我们在添加滤镜效果
class ConCreateDecorator2 extends Decorator{ public ConCreateDecorator2(Component component) { super(component); } @Override public void operation() { System.out.println("添加滤镜效果"); component.operation(); } }
public class DecoratorTest { public static void main(String[] args) { Component component = new ConCreateDecorator2(new ConCreateDecorator1(new ConcreateComponent())); component.operation(); } }
运行结果
我们使用不同的组合模式,可以看到不同的结果,如下:
public class DecoratorTest { public static void main(String[] args) { Component component = new ConCreateDecorator1(new ConCreateDecorator2(new ConcreateComponent())); component.operation(); } }
可以看到美颜和滤镜的执行顺序改变了
- 经典案例
1 Servlet Api:
2 javax.servlet.http.HttpServletRequestWrapper
3 javax.servlet.http.HttpServletResponseWrapper