内容简介:每周写工作总结、工作汇报是许多程序员的伤痛,哈哈。真实情况是又摸鱼了一周,给领导写工作报告,当然不能直接写“摸鱼”,这时候就需要装饰模式来对我们提交的报告做下修饰,甚至领导的评语里面也给加点美化内容,不然, 这个月的奖金就泡汤了,只能吃土了。定义(百度百科):装饰模式指的是在不必改变原类文件和使用继承的情况下,
每周写工作总结、工作汇报是许多 程序员 的伤痛,哈哈。真实情况是又摸鱼了一周,给领导写工作报告,当然不能直接写“摸鱼”,这时候就需要装饰模式来对我们提交的报告做下修饰,甚至领导的评语里面也给加点美化内容,不然, 这个月的奖金就泡汤了,只能吃土了。
一、定义
定义(百度百科):装饰模式指的是在不必改变原类文件和使用继承的情况下, 动态地扩展一个对象的功能 。它是通过创建一个包装对象(装饰对象)来 包裹真实的对象 。
重点:通过创建包装类,包裹真实对象,达到对真实对象的动态扩展。
二、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设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Rails
David Griffiths / O'Reilly Media / 2008-12-30 / USD 49.99
Figure its about time that you hop on the Ruby on Rails bandwagon? You've heard that it'll increase your productivity exponentially, and allow you to created full fledged web applications with minimal......一起来看看 《Head First Rails》 这本书的介绍吧!