设计模式_装饰者模式
1. 概念定义
通过装饰者设计模式,可以帮助原来的主体内容新增、扩展、修改方法内容。
2. 类图关系
3.代码实现
3.1 代码业务解析。
背景信息:
XX报社每月都会出一个期刊,那么期刊的内容是由系统生成以及系统用户上传,因为期刊很多例如财经、天气等内容都是常规内容,排版的变化不大。而期刊当中有些版面需要自定义排版针对近期热点事件,这些页面让系统用户直接做好上传,比调整代码更加快能够生产整本期刊。
3.2 类图
在本次任务设计中,作者认为的期刊是一个整体的复合物(包含系统的、上传的),所以抽象出来一个公共接口(Magazine),然后系统生成的子期刊内容作为主体(MagazineTemplate),系统用户上传(CustomTemplate)的内容像是“装饰”一样,点缀主体。
3.3 具体代码
3.3.1 magazine
package com.lucas.pattern.decorate; /** * 设计模式 - 装饰者模式 DEMO * * Magazine作为一个公共类型规定,规定好了客户上传期刊类,与我们系统的期刊类。 * 系统期刊类:MagzineTemplate * 客户上传期刊类:CustomTemplate */ public abstract class Magazine { //期刊内容描述保存位置。 protected String description; //获取期刊内容描述。 String getDescription(){ return this.description; }; //设置描述内容 abstract void setDescription(String description); }
3.3.2 MagazineTemplate
package com.lucas.pattern.decorate; /** * 系统生成的期刊 */ public class MagazineTemplate extends Magazine{ MagazineTemplate(){ this.description = "[系统生成的期刊内容]"; } @Override void setDescription(String description) { this.description += (description+","); } }
3.3.3 CustomTemplate
package com.lucas.pattern.decorate; /** * 客户提供想期刊内容 */ public class CustomTemplate extends Magazine{ Magazine magazine ; CustomTemplate(Magazine magazine){ this.description="[客户提供想期刊内容]"; this.magazine = magazine; } @Override void setDescription(String description) { this.magazine.description += (this.description+description+","); } }
3.3.4 测试内容类
package com.lucas.pattern.decorate; public class PatternTest { public static void main(String[] args) { MagazineTemplate finalMaga = new MagazineTemplate(); CustomTemplate customTemplate = new CustomTemplate(finalMaga); finalMaga.setDescription("天气预报内容"); finalMaga.setDescription("财经内容"); customTemplate.setDescription("黄子华复出开SHOW"); System.out.println(finalMaga.getDescription()); } }
结果:
4.个人理解
在学习完《HEAD FRIST 设计模式》关于装饰者的模式之后,对此理解如下:
-
装饰者需要基于主体,如果缺乏主体存在,装饰者的功能也没有用武之地。
-
装饰者与主体 ‘抽象’成相同接口,主要其实不是说他们一定要有相同的方法,可以向上造型时触发,而是相当于一个标记,这两个都是属于同类。