1:装饰模式的类图分析

其中类的职责如下:
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
二、下面通过一个软件项目例子来说明装饰模式的使用
过程是这样的:
项目经理接到一个项目,项目最终要完成编码。
项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。
实现代码如下:
/**
     * 写代码
     */
    void doCoding();
}
/**
     * 编码
     */
    public void doCoding(){
        System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!");
    }
}
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() {
    }
}

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

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

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

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

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

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

备注:转自 http://lavasoft.blog.51cto.com/62575/90853/

转载于:https://www.cnblogs.com/goldberg/p/5439195.html

设计模式之装饰模式的学习相关推荐

  1. java设计模式之装饰模式_Java中的装饰器设计模式

    java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...

  2. 设计模式之装饰模式20170726

    结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角 ...

  3. 设计模式-工厂模式(学习)

    设计模式-工厂模式(学习) 在程序的世界里,就像射雕英雄传一样,我们的技能就像是武功一样,我们只有不断去学习练习才能有机会像郭靖一样成为"天下第一". 我认为技能和武功是很类似的, ...

  4. [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...

    原文地址:    https://www.cnblogs.com/zuoxiaolong/p/pattern26.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本 ...

  5. 大话设计模式之装饰模式(python实现)

    大话设计模式之装饰模式 使用场景 定义 装饰模式结构图 python实现装饰模式 代码结构图 优点 使用场景 建造过程不稳定,不确定.把所需的功能按照正确的顺序串联起来进行控制. 新加入的东西仅仅是为 ...

  6. 设计模式之装饰模式详解(附应用举例实现)

    文章目录 1 装饰模式介绍 2 装饰模式详解 2.1 装饰模式结构 2.2 装饰模式实现 2.3 装饰模式应用举例 3 透明装饰模式和半透明装饰模式 1 装饰模式介绍 在生活中,我们往往会给图片增加一 ...

  7. 《设计模式》王争 学习笔记

    <设计模式>王争 学习笔记 面向对象 面向对象 用面向对象编程语言,我们照样可以进行面向对象编程

  8. 设计模式之 装饰模式

    设计模式之 装饰模式 概述: 装饰模式(Decorator Pattern) 又叫装饰者模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也 ...

  9. 设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)

    设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)模式分类 & 传送门 & 对比维度说明 设计原则: 设计模式(总纲) 创建型: 单例模式 简单工厂模式 工厂方法模式 抽象 ...

最新文章

  1. SAP MM 关于采购组设计的思考
  2. 54 分布式任务队列Celery
  3. leetcode 530. 二叉搜索树的最小绝对差(中序遍历)
  4. flowable 图片缓存
  5. 电脑长截图软件_电脑屏幕长截图+WORD文档里没有插入PDF文件选项时怎么办? 简单一招轻松完成...
  6. oracle ado6,c# ado 连接数据库 六步曲
  7. python输入数字是什么类型的游戏_“数字炸弹”——一个练习Python基础知识的小游戏...
  8. 推荐一个滴滴开源的跨端整体解决方案!
  9. 字符串通配符(动态规划)
  10. 计组第六章 计算机的运算方法
  11. jedate时间插件
  12. 【数据结构】—— 树状数组
  13. 服务器数据恢复成功案例(磁盘阵列恢复)
  14. mysql perl教程_使用 Perl 的 MySQL 事务
  15. 微信公众号开发之使用eclipse创建微信web工程并发布到BAE测试
  16. 台湾华夏堂古代玉器收藏家~件件珍贵难得一见
  17. 磁力链接方式下载完全攻略
  18. stm8程序无法写入c语言,[转载]STM8 PWM例程
  19. ”从生命起源到智慧宇宙“全文(英文论文)
  20. 添加购物车及展示购物车列表,修改购物车数量

热门文章

  1. mvc:interceptor 不起作用的一个解决方法
  2. git rebase(变基)—— Git 学习笔记 19
  3. opencv3—— cv::putText()
  4. 标准化Keras:TensorFlow 2.0中的高级API指南
  5. 进击的Android Hook 注入术《二》
  6. linux日志绕接,[判断题] 绕接式保安接线排按结构分为固定式和旋转式。
  7. mac终端mysql的字符集_mac下修改mysql默认字符集为utf8
  8. #地形剖面图_高考地理笔记:经纬网、等值线、地形剖面图知识汇总
  9. docker内外连通ros_docker容器内的ros外设使用与远程配置
  10. 怎么安装python3.6.2_centos7.2下安装python3.6.2