一、模式定义
在不改变原有对象的基础上,将功能附加到对象上;
优点:
1、不改变原有对象的情况下给一个对象拓展功能;
2、使用不同的组合可以实现不同的效果;
3、满足软件开发的开闭原则——对拓展开放,对修改关闭;
二、案例说明
假设目前有一个相机;
现在要求添加一些美颜及滤镜的功能,这些功能都不是必须的,在我需要的时候可以启用,不需要的时候可以关闭,不能影响我正常拍照的功能;
这是就可以使用装饰者模式,定义一个装饰者抽象,在滤镜与美颜的子类中进行实现对应的方法;
三、示例代码
1 /**
2 * 类描述: 装饰者模式
3 *
4 * @author XXSD
5 * @version 1.0.0
6 * @date 2020/1/19 0019 下午 3:19
7 */
8 public class DecoratorTest {
9 public static void main(String[] values){
10 /*
11 * 基本的功能:拍照
12 * */
13 Photograph photograph = new CameraPhotograph();
14 photograph.photo();
15 /*
16 * 增加了滤镜的拍照
17 * */
18 photograph = new FilterCameraPhotograph(new CameraPhotograph());
19 photograph.photo();
20 /*
21 * 增加了美颜滤镜的拍照
22 * */
23 photograph = new BeautyCameraPhotograph(new FilterCameraPhotograph(new CameraPhotograph()));
24 photograph.photo();
25 }
26 }
27
28 /**
29 * 类描述: 拍照接口
30 * @author : XXSD
31 * @date : 2020/1/19 0019 下午 5:50
32 */
33 interface Photograph {
34 /**
35 * 功能描述:拍照功能
36 * @author : XXSD
37 * @date : 2020/1/19 0019 下午 5:51
38 */
39 void photo();
40 }
41
42 /**
43 * 类描述: 相机拍照具体的实现
44 * @author : XXSD
45 * @date : 2020/1/19 0019 下午 5:51
46 */
47 class CameraPhotograph implements Photograph{
48 /**
49 * 功能描述:拍照功能
50 *
51 * @author : XXSD
52 * @date : 2020/1/19 0019 下午 5:51
53 */
54 @Override
55 public void photo() {
56 System.out.println("相机拍照了");
57 }
58 }
59
60 /**
61 * 类描述: 新的需求,加入其元素,但不能影响基本功能,这里使用装饰者模式的抽象层
62 * @author : XXSD
63 * @date : 2020/1/19 0019 下午 6:33
64 */
65 abstract class Decorator implements Photograph{
66 /**
67 * 属性描述:持有一个抽象的引用
68 * 这样可以对被装饰者进行操作
69 * @date : 2020/1/19 0019 下午 6:35
70 */
71 Photograph photograph;
72
73 /**
74 * 功能描述:新的需求,加入其元素,但不能影响基本功能,这里使用装饰者模式的抽象层
75 * @param photograph 基本的抽象实现
76 * @author : XXSD
77 * @date : 2020/1/19 0019 下午 6:35
78 */
79 public Decorator(Photograph photograph) {
80 this.photograph = photograph;
81 }
82 }
83 /**
84 * 类描述: 滤镜功能的添加
85 * @author : XXSD
86 * @date : 2020/1/19 0019 下午 6:41
87 */
88 class FilterCameraPhotograph extends Decorator{
89
90 /**
91 * 功能描述:新的需求,加入其元素,但不能影响基本功能,这里使用装饰者模式的抽象层
92 *
93 * @param photograph 基本的抽象实现
94 * @author : XXSD
95 * @date : 2020/1/19 0019 下午 6:35
96 */
97 public FilterCameraPhotograph(Photograph photograph) {
98 super(photograph);
99 }
100
101 /**
102 * 功能描述:拍照功能
103 *
104 * @author : XXSD
105 * @date : 2020/1/19 0019 下午 5:51
106 */
107 @Override
108 public void photo() {
109 System.out.println("增加了一个滤镜");
110 photograph.photo();
111 }
112 }
113
114 /**
115 * 类描述: 美颜功能的添加
116 * @author : XXSD
117 * @date : 2020/1/19 0019 下午 6:41
118 */
119 class BeautyCameraPhotograph extends Decorator{
120
121 /**
122 * 功能描述:新的需求,加入其元素,但不能影响基本功能,这里使用装饰者模式的抽象层
123 *
124 * @param photograph 基本的抽象实现
125 * @author : XXSD
126 * @date : 2020/1/19 0019 下午 6:35
127 */
128 public BeautyCameraPhotograph(Photograph photograph) {
129 super(photograph);
130 }
131
132 /**
133 * 功能描述:拍照功能
134 *
135 * @author : XXSD
136 * @date : 2020/1/19 0019 下午 5:51
137 */
138 @Override
139 public void photo() {
140 System.out.println("增加了一个美颜滤镜");
141 photograph.photo();
142 }
143 }
四、在Java中的应用
javax.servlet.http.HttpServletRequestWrapper
这是一个装饰者模式的实现,这个类中实现了javax.servlet.http.HttpServletRequest中所有的接口,所以只需要集成这个类,加入自己需要的处理即可;
五、需要应用的场景
拓展一个已经定义好的类,因为业务拓展的需求,需要给这个类添加或附加其他职责时使用;