设计模式——装饰器(Decorator)
2013-10-19 14:22
197 查看
装饰(Decorator)模式 属于设计模式里的结构模式,通过装饰类 动态的给一个对象添加一些额外的职责。装饰模式也叫包装( wrapper )模式。装饰模式有如下的角色:
抽象构件(component)角色 :这个角色用来规范被装饰的对象,一般用接口方式给出。
具体构件(concrete component )角色 :被装饰的类。
装饰(decorator)角色 :持有一个构件对象的实例。并定义一个跟抽象构件一直的接口。
具体 (concrete decorator ) 装饰角色 :负责给具体构件添加附加职责的类。在实际使用中多数情况下装饰角色和具体装饰角色可能由一个类来承担。
装饰模式的类图如下:
装饰模式的例子在生活中很常见,比如房子装修,那房子还是那个房子,只是在房子墙壁上做粉刷,贴墙纸,挂饰品等。java里面的io流,我们经常如下使用:
这个就是装饰模式的使用。还有句话说人靠衣装,美靠靓装。这里就举个程序媛打扮自己的例子来说装饰模式。程序媛打扮自己的模型如下
运行结果:
有了口红,哇塞,狐狸精一个!
刷睫毛了,更漂亮了一些。
画眉了,漂亮了一些。
开始我是素颜。
通过上面例子我们可以看到,装饰模式在于在原有的功能上添加新的职责。装饰模式能够提供比继承更灵活的对象扩展能力,但是也往往由于这种灵活性会是系统调用变的复杂。
抽象构件(component)角色 :这个角色用来规范被装饰的对象,一般用接口方式给出。
具体构件(concrete component )角色 :被装饰的类。
装饰(decorator)角色 :持有一个构件对象的实例。并定义一个跟抽象构件一直的接口。
具体 (concrete decorator ) 装饰角色 :负责给具体构件添加附加职责的类。在实际使用中多数情况下装饰角色和具体装饰角色可能由一个类来承担。
装饰模式的类图如下:
装饰模式的例子在生活中很常见,比如房子装修,那房子还是那个房子,只是在房子墙壁上做粉刷,贴墙纸,挂饰品等。java里面的io流,我们经常如下使用:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
这个就是装饰模式的使用。还有句话说人靠衣装,美靠靓装。这里就举个程序媛打扮自己的例子来说装饰模式。程序媛打扮自己的模型如下
package decorator; public interface 女人 { public void 打扮(); }
package decorator; public class 程序媛 implements 女人 { @Override public void 打扮() { System.out.println("开始我是素颜。"); } }
package decorator; public class 化妆 implements 女人 { private 女人 女人; @Override public void 打扮() { 女人.打扮(); } }
package decorator; public class 画眉 extends 化妆 { private 女人 女人; public 画眉(女人 女人) { super(); this.女人 = 女人; } public void 打扮() { System.out.println("画眉了,漂亮了一些。"); 女人.打扮(); } }
package decorator; public class 刷睫毛 extends 化妆 { private 女人 女人; public 刷睫毛(女人 女人) { super(); this.女人 = 女人; } public void 打扮() { System.out.println("刷睫毛了,更漂亮了一些。"); 女人.打扮(); } }
package decorator; public class 涂口红 extends 化妆 { private 女人 女人; public 涂口红(女人 女人) { super(); this.女人 = 女人; 打扮(); } public void 打扮() { System.out.println("有了口红,哇塞,狐狸精一个!"); 女人.打扮(); } }
package decorator; public class Client { /** *作者:alaric *时间:2013-7-22下午10:57:13 *描述:测试 */ public static void main(String[] args) { 女人 女1 = new 程序媛(); new 涂口红(new 刷睫毛(new 画眉(女1))); } }
运行结果:
有了口红,哇塞,狐狸精一个!
刷睫毛了,更漂亮了一些。
画眉了,漂亮了一些。
开始我是素颜。
通过上面例子我们可以看到,装饰模式在于在原有的功能上添加新的职责。装饰模式能够提供比继承更灵活的对象扩展能力,但是也往往由于这种灵活性会是系统调用变的复杂。
相关文章推荐
- Lucene 实例 IKAnalyzer中文分词器
- Windows8的JDK环境配置
- 视频质量,分辨率以及码率之间的关系
- 视频质量,分辨率以及码率之间的关系
- 获取SQL SERVER数据库表名和列名的sql语句
- 笔记7:vb.net的异步读写数据流(使用线程、委托)
- 纯C创建二叉树及二叉树的遍历
- four pictures to explain DOM
- Ubuntu 12.04 LTS下环境变量设置
- commons-fileupload应用
- correlated subquery and non-correlated subquery
- 适合秋季饮用的润燥润肺的果蔬汁
- CentOS6.4换YUM源
- 大数阶乘思考
- ubuntu 12.04 LTS 中创建FTP服务器
- python 的第一个小程序 Hello world!
- mysql备份脚本以及删除前5天的备份文件
- POJ 2752 Seek the Name, Seek the Fame (KMP)
- Openfire 单人聊天和多人聊天(发送消息、接收消息)
- POJ 2752 Seek the Name, Seek the Fame (KMP)