顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

装饰器模式的应用场景:

1、需要扩展一个类的功能。

2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错!

其中类的职责如下:
 
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
 
二、装饰模式的使用
  Interface : Project

package edu.gof.decorator;

//抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
public interface Project { // 编写代码
void doCoding();
}

  Class : Employe

package edu.gof.decorator;

//具体构件角色(Employe):定义一个将要接收附加责任的类
public class Employe implements Project { // 真正的编码工作
public void doCoding() {
System.out.println("码农:佛祖保佑,没有BUG");
} }

  Class : Manager

package edu.gof.decorator;

//装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
public class Manager implements Project { // 实际上存放的是代码工人对象
private Project project; public Manager() {
super();
} public Manager(Project project) {
super();
this.project = project;
} // 编码,总揽大局。装饰编码过程。
public void doCoding() {
// 项目经理开始新的项目
this.startNewWork();
} // 模板:定义项目经理自己的事情
public void startNewWork() {
// 项目经理在做早期工作
this.doEarlyWork();
// 早期工作完成,交由码农开始真正的编码工作
this.project.doCoding();
// 项目经理在做收尾工作
this.doEndWork();
} // 项目经理的早期工作
public void doEndWork() { } // 项目经理的收尾工作
public void doEarlyWork() { } }

  Class : ManagerA

package edu.gof.decorator;

public class ManagerA extends Manager {

    public ManagerA() {
super();
} public ManagerA(Project project) {
super(project);
} public void doEarlyWork(){
System.out.println("项目经理A 在做需求分析");
System.out.println("项目经理A 在做架构设计");
System.out.println("项目经理A 在做详细设计");
} }

  Class : ManagerB

package edu.gof.decorator;

public class ManagerB extends Manager {

    public ManagerB() {
super();
} public ManagerB(Project project) {
super(project);
} public void doEarlyWork(){
System.out.println("项目经理B 在做需求分析");
System.out.println("项目经理B 在做架构设计");
} public void doEndWork(){
System.out.println("项目经理B 在做收尾工作");
} }

  Class : DecoratorTest

package edu.gof.decorator;

public class DecoratorTest {

    public static void main(String[] args){
Project ManagerA = new ManagerA(new Employe());
ManagerA.doCoding();
System.out.println("------------------------");
Project ManagerB = new ManagerB(new Employe());
ManagerB.doCoding();
}
}

  Console :

项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
码农:佛祖保佑,没有BUG
------------------------
项目经理B 在做需求分析
项目经理B 在做架构设计
码农:佛祖保佑,没有BUG
项目经理B 在做收尾工作

啦啦啦

最新文章

  1. CSipSimple 简单分析
  2. 优化MySchool数据库(事务、视图、索引)
  3. 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(一)
  4. sell - 配置service
  5. WebView自适应屏幕大小
  6. csv内存流文件流
  7. IOS 下雪动画修改版本
  8. 利用Sails.js+MongoDB开发博客系统
  9. java多线程基本概述(五)——线程通信
  10. Modular javascript(javascript模块化编程)
  11. 谈谈对Python的感想
  12. DigitalClock的替代者TextClock
  13. php7函数,声明,返回值等新特性介绍
  14. poj1094 恶心题,,每次加边进行判断
  15. 一种比较low的linux的hung分析
  16. svg translate 操作
  17. 【python 3.6】python获取当前时间及过去或将来的指定时间
  18. 干接点&湿接点
  19. 生日蜡烛——第七届蓝桥杯C语言B组(省赛)第二题
  20. ViBe(Visual Background extractor)背景建模或前景检测

热门文章

  1. hbase 学习(十四)Facebook针对hbase的优化方案分析
  2. es 加磁盘扩容
  3. webpack3--配置多入口和多出口
  4. 升级R语言
  5. 关于Unity中Time.deltaTime的使用
  6. Numpy 的数学和统计方法
  7. C++ 指针二维数组, C++二维指针数组笔记
  8. Android WiFi 扫描流程分析(wpa_supplicant选择网络)
  9. 2014年第五届蓝桥杯C/C++B组省赛题目解析
  10. RedHat 6.4 安装WAS 7.0 启动失败com.ibm.websphere.ssl.SSLException