内容简介:每周写工作总结、工作汇报是许多程序员的伤痛,哈哈。真实情况是又摸鱼了一周,给领导写工作报告,当然不能直接写“摸鱼”,这时候就需要装饰模式来对我们提交的报告做下修饰,甚至领导的评语里面也给加点美化内容,不然, 这个月的奖金就泡汤了,只能吃土了。定义(百度百科):装饰模式指的是在不必改变原类文件和使用继承的情况下,
每周写工作总结、工作汇报是许多 程序员 的伤痛,哈哈。真实情况是又摸鱼了一周,给领导写工作报告,当然不能直接写“摸鱼”,这时候就需要装饰模式来对我们提交的报告做下修饰,甚至领导的评语里面也给加点美化内容,不然, 这个月的奖金就泡汤了,只能吃土了。
一、定义
定义(百度百科):装饰模式指的是在不必改变原类文件和使用继承的情况下, 动态地扩展一个对象的功能 。它是通过创建一个包装对象(装饰对象)来 包裹真实的对象 。
重点:通过创建包装类,包裹真实对象,达到对真实对象的动态扩展。
二、UML
看下我们上面的场景用装饰模式实现的UML图。
1、WorkReport为工作报告的抽象类,定义了两个方法,reportdata()用于查看工作报告的内容,check方法是领导点评的。
2、RealReport为实际的报告类。
3、Decorator为装饰类的抽象类,经过装饰后的报告依然得是报告,所以装饰抽象类继承自工作报告
4、DecAddDescript、DecAddComment为具体的装饰类。
三、代码实例
看下代码实现
1、工作报告抽象类
package com.design.decorator; public abstract class WorkReport { public abstract void reportData(); public abstract void check(String comment); } 复制代码
2、工作报告
package com.design.decorator; public class RealReport extends WorkReport { @Override public void reportData() { System.out.println("工作描述:"); System.out.println("这周的工作是调试了俩个BUG!!"); } @Override public void check(String comment) { System.out.println("评述:"); System.out.println(comment); } } 复制代码
3、装饰抽象类,持有工作报告的引用,扩展报告。
package com.design.decorator; public abstract class Decorator extends WorkReport { protected WorkReport workReport; public Decorator(WorkReport workReport){ this.workReport = workReport; } } 复制代码
4、具体的装饰类,扩展查看报告方法
package com.design.decorator; public class DecAddDescript extends Decorator{ public DecAddDescript(WorkReport workReport) { super(workReport); } @Override public void reportData() { //动态扩展,增加一些描述 super.workReport.reportData(); System.out.println("这周出来的两个BUG比较诡异!经过各种折腾,费尽九牛二虎之类才搞定的,别看只是两个bug,工作量可不少!!"); System.out.println(); } @Override public void check(String comment) { super.workReport.check(comment); } } 复制代码
具体的装饰类,扩展领导审核功能
package com.design.decorator; public class DecAddComment extends Decorator { public DecAddComment(WorkReport workReport) { super(workReport); } @Override public void reportData() { workReport.reportData(); } @Override public void check(String comment) { workReport.check(comment); ////动态扩展,悄悄把领导的评语后面增加一些内容 System.out.println("XXX同学虽然只改两个BUG,但修复这两个BUG意义重大,给他全额奖金!!"); } } 复制代码
5、最终运行
package com.design.decorator; public class TestMain { public static void main(String[] args) { WorkReport workReport = new RealReport(); //装饰一下描述 WorkReport decAddDescript = new DecAddDescript(workReport); //装饰一下领导评语,背着领导偷偷加 WorkReport decACommnet = new DecAddComment(decAddDescript); decACommnet.reportData(); decACommnet.check("修复了两个bug!!"); } }复制代码
测试结果
四、总结
从定义中,我们就可以知道装饰模式的用处了, 扩展对象的功能 ,而且是在 不修改原对象 的情况下。
优点:
1、有力于分离开核心功能与非核心的扩展功能。 我们可以将核心功能放到实际类上,其他非核心装饰类的功能放到装饰类上。
2、灵活扩展装饰 ,如上例子,如果我们不需要扩展评语,只扩展工作描述,则只需要在装饰链上面,去除评语对象的。只需修改客户端代码即可。新增扩展功能,也仅需增加装饰类。
WorkReport workReport = new RealReport(); //装饰一下描述 WorkReport decAddDescript = new DecAddDescript(workReport);复制代码
缺点:
1、装饰链较长情况下,逻辑比较复杂,不利于阅读代码。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
刘大猫的财富之旅
刘欣、刘大猫 / 新华出版社 / 2017-7-21 / 58.00元
作者刘大猫是一名90后的互联网连环创业者,26岁的他通过互联网创业收获到了财富,不仅仅是物质财富,还有认知的财富。 与其他创业类书籍不通的是,这本书非常真实,务实。书中没有任何大道理鸡汤,作者用平实的语言记录了创业以来遇到的种种事情,变化,困境,以及阶段性的成绩,记录了作者务实,鲜活的创业青春。一起来看看 《刘大猫的财富之旅》 这本书的介绍吧!