每周写工做总结、工做汇报是许多程序员的伤痛,哈哈。真实状况是又摸鱼了一周,给领导写工做报告,固然不能直接写“摸鱼”,这时候就须要装饰模式来对咱们提交的报告作下修饰,甚至领导的评语里面也给加点美化内容,否则, 这个月的奖金就泡汤了,只能吃土了。程序员
重点:经过建立包装类,包裹真实对象,达到对真实对象的动态扩展。bash
看下咱们上面的场景用装饰模式实现的UML图。markdown
一、WorkReport为工做报告的抽象类,定义了两个方法,reportdata()用于查看工做报告的内容,check方法是领导点评的。ide
二、RealReport为实际的报告类。测试
三、Decorator为装饰类的抽象类,通过装饰后的报告依然得是报告,因此装饰抽象类继承自工做报告this
四、DecAddDescript、DecAddComment为具体的装饰类。spa
看下代码实现调试
一、工做报告抽象类code
package com.design.decorator;
public abstract class WorkReport {
public abstract void reportData();
public abstract void check(String comment);
}
复制代码
二、工做报告orm
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); } } 复制代码
三、装饰抽象类,持有工做报告的引用,扩展报告。
package com.design.decorator;
public abstract class Decorator extends WorkReport {
protected WorkReport workReport;
public Decorator(WorkReport workReport){
this.workReport = workReport;
}
}
复制代码
四、具体的装饰类,扩展查看报告方法
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意义重大,给他全额奖金!!"); } } 复制代码
五、最终运行
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!!"); } }复制代码
测试结果
从定义中,咱们就能够知道装饰模式的用处了,扩展对象的功能,并且是在不修改原对象的状况下。
优势:
一、有力于分离开核心功能与非核心的扩展功能。咱们能够将核心功能放到实际类上,其余非核心装饰类的功能放到装饰类上。
二、灵活扩展装饰,如上例子,若是咱们不须要扩展评语,只扩展工做描述,则只须要在装饰链上面,去除评语对象的。只需修改客户端代码便可。新增扩展功能,也仅需增长装饰类。
WorkReport workReport = new RealReport();
//装饰一下描述
WorkReport decAddDescript = new DecAddDescript(workReport);复制代码
缺点:
一、装饰链较长状况下,逻辑比较复杂,不利于阅读代码。