装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。
装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。装饰模式最浅显的例子是相片-相框的例子。
一、原理图
其中类的职责如下:
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
二、下面通过一个软件项目例子来说明装饰模式的使用
过程是这样的:
项目经理接到一个项目,项目最终要完成编码。
项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。
实现代码如下:
/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 12:51:06 
* 项目 
*/ 
public interface Project {

/** 
     * 写代码 
     */ 
    void doCoding(); 
}

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 12:52:12 
* 代码工人 
*/ 
public class Employe implements Project{ 
    /** 
     * 编码 
     */ 
    public void doCoding(){ 
        System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!"); 
    } 
}
/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 12:51:26 
* 项目经理 
*/ 
public class Manager implements Project { 
    private Project project;        //实际上存放的是代码工人对象

public Manager(Project project) { 
        this.project = project; 
    }

/** 
     * 编码 
     */ 
    public void doCoding() { 
        //项目经理开始新的工作 
        startNewWork(); 
    }

/** 
     * 模板:定义项目经理自己的事情 
     */ 
    public void startNewWork() { 
        //项目经理在做早期工作 
        doEarlyWork(); 
        //项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干 
        project.doCoding(); 
        //项目经理在做收尾工作 
        doEndWork(); 
    }

/** 
     * 项目经理自己的事情:做早期工作 
     */ 
    public void doEarlyWork() { 
    }

/** 
     * 项目经理做收尾工作 
     */ 
    public void doEndWork() { 
    } 
}

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 13:45:18 
* 具体的项目经理A 
*/ 
public class ManagerA extends Manager{

public ManagerA(Project project) { 
        super(project); 
    }

/** 
     * 项目经理自己的事情:做早期工作 
     */ 
    public void doEarlyWork() { 
        System.out.println("项目经理A 在做需求分析"); 
        System.out.println("项目经理A 在做架构设计"); 
        System.out.println("项目经理A 在做详细设计"); 
    } 
}

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 13:45:27 
* 具体的项目经理B 
*/ 
public class ManagerB extends Manager {

public ManagerB(Project project) { 
        super(project); 
    }

/** 
     * 项目经理自己的事情:做早期工作 
     */ 
    public void doEarlyWork() { 
        System.out.println("项目经理B 在做需求分析"); 
        System.out.println("项目经理B 在做详细设计"); 
    }

/** 
     * 项目经理做收尾工作 
     */ 
    public void doEndWork() { 
        System.out.println("项目经理B 在做收尾工作"); 
    } 
}

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-3 13:03:22 
* 客户端测试 
*/ 
public class Client { 
    public static void main(String args[]) { 
        Project employe = new Employe();        //代码工人 
        Project managerA = new ManagerA(employe); //项目经理 
        Project managerB = new ManagerB(employe); //项目经理 
        //以经理的名义将编码完成,功劳都是经理的,实际编码的是工人 
        managerA.doCoding(); 
        managerB.doCoding(); 
    } 
}
运行结果:
项目经理A 在做需求分析 
项目经理A 在做架构设计 
项目经理A 在做详细设计 
代码工人 在编写代码,加班编啊编啊,终于编完了! 
项目经理B 在做需求分析 
项目经理B 在做详细设计 
代码工人 在编写代码,加班编啊编啊,终于编完了! 
项目经理B 在做收尾工作

Process finished with exit code 0

本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/90853,如需转载请自行联系原作者

Java与模式:装饰(Decorator)模式相关推荐

  1. Java设计模式之再从[暗黑破坏神装备镶嵌宝石系统]分析装饰(Decorator)模式

    在暗黑破坏神等RPG游戏中,会遇到如下的一些场景:我有一把很普通的武器,我通过给它"注入魔法力量"."镶嵌宝石",来使得它拥有一些攻击特效:例如,一把普通长剑, ...

  2. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  3. Java 设计模式之装饰者模式

    一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...

  4. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  5. java中的装饰者模式[63]

    java中的装饰者模式[63] 文章目录 java中的装饰者模式[63] 一.什么是装饰者模式? 二.装饰者模式要点 三.代码演示 四.小结 一.什么是装饰者模式? **1.意图:**动态的给一个对象 ...

  6. Java设计模式 -10- 装饰器模式(Decorator模式)

    Java设计模式 -10- 装饰器模式(Decorator模式) 前言 装饰器模式的定义与特点 优点: 缺点: 装饰器模式的结构与实现 1. 模式的结构 2. 模式的实现 装饰器模式的应用实例 装饰器 ...

  7. 设计模式:装饰(Decorator)模式

    设计模式之装饰(Decorator)模式 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相片加相框等.在软件开发过程中,有时想用一些现存的组件.这些组件可能只是完成了一些核心功 ...

  8. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  9. 也说说“从Adapter模式到Decorator模式”

    为什么80%的码农都做不了架构师?>>>    终于有时间写点什么了,可以前酝酿好的东西似乎一下子都忘记了.这几天看了wayfarer的<<让僵冷的翅膀飞起来>系列 ...

  10. Java 8的装饰器模式

    在最近的一篇文章中,我描述了装饰器模式如何拯救了我的一天. 我给出了一个小代码段,其中包含创建装饰器的最简单方法,但承诺Java 8会有更好的方法. 这里是: 用Java 8装饰 HyperlinkL ...

最新文章

  1. 【Luogu】P1613 跑路
  2. CSS上下左右居中的几种方法
  3. Linux_进程管理计划任务
  4. wxWidgets:位图和图标
  5. centos7升级gcc到5.3.0
  6. 专业摄影旗舰!vivo X30系列正式发布:支持60倍超级变焦
  7. 【考试记录】20181003
  8. godaddy 安装 ssl
  9. shrink_page_list 函数分析
  10. 线性代数学习指导与MATLAB编程实践,线性代数学习指导与MATLAB编程实践(邵建峰)...
  11. 02. Yii 2.0 框架的目录结构
  12. namenode启动报错:There appears to be a gap in the edit log. We expected txid 1, but got txid 16
  13. 常用照片尺寸和纸张尺寸参考
  14. 小米也打价格战?会有1999的小米2吗?
  15. 大数据华而不实么?大数据的本质是什么?
  16. 出圈c语言,c语言作业 出圈游戏
  17. 清晰度、分辨率、像素、4K、HDR的区别
  18. 案件精灵9判断坐标颜色变化发出提示音(按键精灵9接收通知必备)
  19. 10款 Mac 经典原型设计开发软件推荐
  20. 哈勃发现史上最遥远单颗恒星 距离地球129亿光年

热门文章

  1. create-react-app脚手架中配置webpack的方法
  2. 数组:正整数数组分成2组使其和的差的绝对值最小
  3. Source Insight 中查看日文注释
  4. Jmeter中主要管理器功用
  5. vue修改数组元素方法
  6. 软工课后作业01 15100152
  7. WPF:Webbrowser 捕获关闭事件
  8. vue-resource HTTP API基础
  9. iphone clearColor 不起作用问题
  10. 合并多行查询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数