设计模式之装饰模式

栏目: 后端 · 发布时间: 4年前

内容简介:每周写工作总结、工作汇报是许多程序员的伤痛,哈哈。真实情况是又摸鱼了一周,给领导写工作报告,当然不能直接写“摸鱼”,这时候就需要装饰模式来对我们提交的报告做下修饰,甚至领导的评语里面也给加点美化内容,不然,  这个月的奖金就泡汤了,只能吃土了。定义(百度百科):装饰模式指的是在不必改变原类文件和使用继承的情况下,

每周写工作总结、工作汇报是许多 程序员 的伤痛,哈哈。真实情况是又摸鱼了一周,给领导写工作报告,当然不能直接写“摸鱼”,这时候就需要装饰模式来对我们提交的报告做下修饰,甚至领导的评语里面也给加点美化内容,不然,  这个月的奖金就泡汤了,只能吃土了。

一、定义

定义(百度百科):装饰模式指的是在不必改变原类文件和使用继承的情况下, 动态地扩展一个对象的功能 。它是通过创建一个包装对象(装饰对象)来 包裹真实的对象

重点:通过创建包装类,包裹真实对象,达到对真实对象的动态扩展。

二、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、装饰链较长情况下,逻辑比较复杂,不利于阅读代码。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Docker开发指南

Docker开发指南

[英] Adrian Mouat / 黄彦邦 / 人民邮电出版社 / 2017-4 / 79.00元

Docker容器轻量和可移植的特性尤其适用于动态和分布式的环境,它的兴起给软件开发流程带来了一场革命。本书对Docker进行了全面讲解,包括开发、生产以至维护的整个软件生命周期,并对其中可能出现的一些问题进行了探讨,如软件版本差异、开发环境与生产环境的差异、系统安全问题,等等。一起来看看 《Docker开发指南》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具