A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李江 中级黑马   /  2013-10-13 13:51  /  1300 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

转自:http://alaric.iteye.com/blog/1911980

装饰(Decorator)模式属于设计模式里的结构模式,通过装饰类动态的给一个对象添加一些额外的职责。装饰模式也叫包装(wrapper)模式。装饰模式有如下的角色:

抽象构件(component)角色:这个角色用来规范被装饰的对象,一般用接口方式给出。

具体构件(concrete component)角色:被装饰的类。

装饰(decorator)角色:持有一个构件对象的实例。并定义一个跟抽象构件一直的接口。

具体(concrete  decorator装饰角色:负责给具体构件添加附加职责的类。在实际使用中多数情况下装饰角色和具体装饰角色可能由一个类来承担。

装饰模式的类图如下:


装饰模式的例子在生活中很常见,比如房子装修,那房子还是那个房子,只是在房子墙壁上做粉刷,贴墙纸,挂饰品等。java里面的io流,我们经常如下使用:


Java代码  

  • BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));  


这个就是装饰模式的使用。还有句话说人靠衣装,美靠靓装。这里就举个程序媛打扮自己的例子来说装饰模式。程序媛打扮自己的模型如下


Java代码  

  • package decorator;  
  •   
  • public interface 女人 {  
  •   
  •     public void 打扮();  
  •       
  • }  

Java代码  

  • package decorator;  
  •   
  • public class 程序媛 implements 女人 {  
  •   
  •     @Override  
  •     public void 打扮() {  
  •          
  •         System.out.println("开始我是素颜。");  
  •   
  •     }  
  •   
  • }  

Java代码  

  • package decorator;  
  •   
  • public class 化妆 implements 女人 {  
  •   
  •     private 女人 女人;  
  •     @Override  
  •     public void 打扮() {  
  •         女人.打扮();  
  •     }  
  •   
  • }  

Java代码  

  • package decorator;  
  •   
  • public class 画眉  extends 化妆 {  
  •   
  •     private 女人 女人;  
  •       
  •       
  •     public 画眉(女人 女人) {  
  •         super();  
  •         this.女人 = 女人;  
  •     }  
  •   
  •   
  •     public void 打扮() {  
  •         System.out.println("画眉了,漂亮了一些。");  
  •         女人.打扮();  
  •     }  
  •   
  • }  

Java代码  

  • package decorator;  
  •   
  • public class 刷睫毛  extends 化妆 {  
  •   
  •     private 女人 女人;  
  •       
  •       
  •     public 刷睫毛(女人 女人) {  
  •         super();  
  •         this.女人 = 女人;  
  •     }  
  •   
  •   
  •     public void 打扮() {  
  •         System.out.println("刷睫毛了,更漂亮了一些。");  
  •         女人.打扮();  
  •     }  
  •   
  • }  

Java代码  

  • package decorator;  
  •   
  • public class 涂口红  extends 化妆 {  
  •   
  •     private 女人 女人;  
  •       
  •       
  •     public 涂口红(女人 女人) {  
  •         super();  
  •         this.女人 = 女人;  
  •         打扮();  
  •     }  
  •   
  •   
  •     public void 打扮() {  
  •         System.out.println("有了口红,哇塞,狐狸精一个!");  
  •         女人.打扮();  
  •     }  
  •   
  • }  

Java代码  

  • package decorator;  
  •   
  • public class Client {  
  •   
  •     /**
  •      *作者:alaric
  •      *时间:2013-7-22下午10:57:13
  •      *描述:测试
  •      */  
  •     public static void main(String[] args) {  
  •   
  •         女人 女1 = new 程序媛();  
  •         new 涂口红(new 刷睫毛(new 画眉(女1)));  
  •          
  •     }  
  •   
  • }  

运行结果:

有了口红,哇塞,狐狸精一个!

刷睫毛了,更漂亮了一些。

画眉了,漂亮了一些。

开始我是素颜。


通过上面例子我们可以看到,装饰模式在于在原有的功能上添加新的职责。装饰模式能够提供比继承更灵活的对象扩展能力,但是也往往由于这种灵活性会是系统调用变的复杂。
ps:最近重新学习设计模式,所写相关笔记纯属个人对书本和资料的理解,如有不到之处请大家指出,共同探讨学习设计模式。

1 个回复

正序浏览
BufferedReader  就是个装饰类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马