装饰模式使用被装饰类的一个子类的实例。把client的调用委派到被装饰类,装饰模式的关键在于这样的扩展是全然透明的。
 
装饰模式在Java种使用也非常广泛,比方我们在又一次定义button、对话框等时候,实际上已经在使用装饰模式了。

装饰模式最浅显的样例是相片-相框的样例。

 
一、原理图

当中类的职责例如以下:
 
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
详细构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例。并定义一个与抽象构件接口一致的接口
详细装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
 
二、以下通过一个软件项目样例来说明装饰模式的使用
过程是这种:
项目经理接到一个项目。项目终于要完毕编码。

项目经理接到项目后。先做些前期的工作(比方需求分析、设计),然后将编码工作委派给代码工人,代码工人干完后,项目经理做项目的收尾工作。
 
实现代码例如以下:
package com.dashu.decorator;

/**
* 项目接口
* */
public interface Project {
/**
* 写代码
*/
public void doCoding();
}
package com.dashu.decorator;

/**
* 代码工人
* */
public class Employe implements Project { //程序猿编码
@Override
public void doCoding() {
System.out.println("代码工人 在编写代码。加班编啊编啊,最终编完了!");
}
}
package com.dashu.decorator;

/**
*项目经理
* */
public class Manager implements Project {
private Project project; // 实际上存放的是代码工人对象 public Manager(Project project) {
this.project = project;
} @Override
public void doCoding() {
// 项目经理開始新的工作
startNewWork();
} /**
* 模板:定义项目经理自己的事情
*/
public void startNewWork() {
// 项目经理在做早期工作
doEarlyWork();
// 项目经理非常牛,做完需求和设计后,直接将编码委派给代码工人干
project.doCoding();
// 项目经理在做收尾工作
doEndWork();
} /**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
} /**
* 项目经理做收尾工作
*/
public void doEndWork() {
}
}
package com.dashu.decorator;

/**
* 项目经理A
* */
public class ManagerA extends Manager { public ManagerA(Project project) {
super(project);
// TODO Auto-generated constructor stub
} /**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
System.out.println("项目经理A 在做需求分析");
System.out.println("项目经理A 在做架构设计");
System.out.println("项目经理A 在做具体设计");
} }
package com.dashu.decorator;

/**
* 项目经理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 在做收尾工作");
}
}

Java与模式:装饰(Decorator)模式的更多相关文章

  1. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  2. 装饰(Decorator)模式

    1.装饰(Decorator)模式    动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活.Component是定义一个对象接口.可以给这些对象动态地添加职责.Concre ...

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

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

  4. Java中InputStream装饰器模式的大家族

    本文写在po主初学JAVA时,在学习inputStream摸不着头脑,受Java IO-InputStream家族 -装饰者模式一文启发,所以在理清思路时写下本文.因为初学,如有错误,望指正. 因为和 ...

  5. 23种java设计模式之装饰者模式及动态代理

    设计模式不管对于何种语言都是存在的,这里介绍的是java的模式 装饰者模式是在二次开发中应用比较多的一款模式,当然了用反射也是可以实现的,今天介绍的是装饰模式,有兴趣的朋友可以自己去了解一下反射是怎么 ...

  6. Decorator模式 装饰器模式

    Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加 ...

  7. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  8. java设计模式之七装饰器模式(Decorator)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...

  9. Java 实现装饰(Decorator)模式

    在Java在.io反映非常多类包下是典型的装饰格局,例如: new BufferedOutputStream(OutputStream out) new BufferedInputStream(Inp ...

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

    要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...

随机推荐

  1. POJ 3038 贪心(multiset)

    题意: 思路: 1. 贪心 我们考虑肯定是走最近的最合适 想象自己是一个黑一日游的司机: 1.如果有乘客要上车,那么就让他上,收钱! 2.如果超载了,把距目的地最远的几个乘客踢下去,退钱. 3.行驶到 ...

  2. Java(标识符,关键字,注释,常量,变量)

    标识符 在java程序中有些名字是可以自定义的,那么这些自定义的名字我们就称作为自定义的标识符. 标识符要注意的细节: 标识符的组成元素是由字母(a-zA-Z).数字(0-9).下划线(_).美元符号 ...

  3. ip---查看网络信息

    Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者. ifconfig属于net-tools.ip属于iproute2 设置一个IP地址,可以使用下列ip命令: ip add ...

  4. 【OC学习-8】存取器方法?getter和setter?事实上就是赋值和返回值的两种函数

    我们在声明类的时候,有实例变量+方法(函数),这些实例变量假设默认的话都是protected类型,一般无法直接訪问.更别提赋值和调用了,所以就产生了两种函数,getter函数就是可以返回实例变量的值, ...

  5. js03 数组

    变量的自动转换=== 等同符:不会发生类型的自动转化! == 等值符:会发生类型自动转化.自动匹配!判断相等没有equals()方法,只有2个等号3个等号. <!DOCTYPE HTML PUB ...

  6. zendiscovery 的Ping机制

    ping是集群发现的基本手段,通过在网络上广播或者指定ping某些节点获取集群信息,从而可以找到集群的master加入集群.zenDiscovery实现了两种凭机制:广播与单播.本篇将详细分析一些这M ...

  7. 类似C语言格式化输出

    java se5引入的format方法可以用于PrintStream或PrintWriter对象,format方法模仿自C的printf(), 如果你比较怀旧的话,也可以用printf(). pack ...

  8. 9.Maven之(九)依赖关系

    转自:https://yq.aliyun.com/ziliao/312160 在maven的管理体系中,各个项目组成了一个复杂的关系网,但是每个项目都是平等的,是个没有贵贱高低,众生平等的世界,全球每 ...

  9. golang filepath.Glob

    package main import ( "fmt" "path/filepath" ) func main() { //找出/home/ 目录下的所有的lo ...

  10. Android系统如何管理自己内存的?

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 机缘巧合写下这篇博客,作为个人工作经验的总结,不足之处,随后补上. 安卓是基于Linux2.6内核的 ...