设计模式之装饰模式

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

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

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

一、定义

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

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

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


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

查看所有标签

猜你喜欢:

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

Programming Rust

Programming Rust

Jim Blandy / O'Reilly Media / 2016-8-25 / GBP 47.99

This practical book introduces systems programmers to Rust, the new and cutting-edge language that’s still in the experimental/lab stage. You’ll learn how Rust offers the rare and valuable combination......一起来看看 《Programming Rust》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器