包装设计模式(当函数功能不够用,除了继承重载的另一种方法)

------------------------------————————————————————————————

1.定义一个类,实现与被增强对象相同的接口

2.在类中定义一个对象,记住被增强对象

3。定义一个构造函数,接收被增强对象

4.覆盖想增强的方法

5.对于不想增强的对象,直接调用目标对象(被增强对象的方法)

————————————————————————————————————————————

《设计模式》一书对Decorator是这样描述的:
 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式比生成子类更为灵活。
也就是说:动态地给对象添加一些额外的功能。它的工作原理是:创建一个始于Decorator对象(负责新功能的对象)终止于原对象的一个对象的“链”。例如,我们要为超市的收银台设计一个打印票据的程序,有的需要打印票据的头信息,有的需要打印票据的页脚信息,有的只需要打印票据的内容。如果针对每一种情况都修改一次程序,势必会很麻烦。这时我们可以考虑使用Decorator模式。其结构类图如下:
decorator

 

[java] view plaincopy
 
  1. abstract public class Component {  
  2.     abstract public void printTicket();  
  3. }  
  4. public class SalesTicket extends Component {     
  5.         
  6.     public void printTicket() {     
  7.         System.out.println("打印出salesTicket的内容");     
  8.     }     
  9. }   
  10. public abstract class TicketDecorator extends Component {  
  11.   
  12.     private Component myTrailer;  
  13.   
  14.     public TicketDecorator(Component myComponent)  
  15.     {  
  16.         myTrailer = myComponent;  
  17.     }  
  18.   
  19.     public void callTrailer()  
  20.     {  
  21.         if (myTrailer != null)  
  22.             myTrailer.printTicket();  
  23.     }  
  24. }  
  25. public class Header extends TicketDecorator {  
  26.   
  27.     public Header(Component myComponent)  
  28.     {  
  29.         super(myComponent);  
  30.     }  
  31.   
  32.     public void printTicket()  
  33.     {  
  34.         System.out.println("打印salesTicket的头信息");  
  35.         super.callTrailer();  
  36.     }  
  37. }  
  38. public class Footer extends TicketDecorator {  
  39.   
  40.     public Footer(Component myComponent)  
  41.     {  
  42.         super(myComponent);  
  43.     }  
  44.   
  45.     public void printTicket()  
  46.     {  
  47.         super.callTrailer();  
  48.         System.out.println("打印salesTicket的页脚信息");  
  49.     }  
  50. }  
  51. public class Client  
  52. {  
  53.     public static void main(String[] args)  
  54.     {  
  55.         System.out.println("====================================");  
  56.         new Header(new Footer(new SalesTicket())).printTicket();  
  57.         System.out.println("====================================");  
  58.         new Footer(new Header(new SalesTicket())).printTicket();  
  59.         System.out.println("====================================");  
  60.     }  
  61. }  

 

输出结果:
====================================
打印salesTicket的头信息
打印出salesTicket的内容
打印salesTicket的页脚信息
====================================
打印salesTicket的头信息
打印出salesTicket的内容
打印salesTicket的页脚信息
====================================

从这个例子我们可以看出,Decorator模式把问题分为两部分:
1) 如何实现提供新功能的对象。
2) 如何为每种特殊情况组织对象。
这样能够将Decorator对象的实现与决定如何使用Decorator的对象分离开来,从而提高了内聚性,因为每个Decorator对象只用关心自己添加的功能,无需关心自己是如何被加入到对象链中。还可以任意地重排Decorator的顺序,无需改变其任何代码。
小结:Decorator模式的适用场合是,各种可选的功能在另一个肯定要执行的功能之前或之后执行。

 

!!!!!!(转)!!!!!!!

posted @ 2014-05-17 15:56  圣婴  阅读(302)  评论(0编辑  收藏  举报