设计模式-装饰者模式

143 阅读4分钟

一、模式定义

在不改变原有对象的基础上,将功能附加到对象上;

优点:
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中所有的接口,所以只需要集成这个类,加入自己需要的处理即可;

五、需要应用的场景

拓展一个已经定义好的类,因为业务拓展的需求,需要给这个类添加或附加其他职责时使用;