包装模式

    xiaoxiao2021-03-25  166

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

    [Java]  view plain  copy abstract public class Component {       abstract public void printTicket();   }   public class SalesTicket extends Component {                   public void printTicket() {              System.out.println("打印出salesTicket的内容");          }      }    public abstract class TicketDecorator extends Component {          private Component myTrailer;          public TicketDecorator(Component myComponent)       {           myTrailer = myComponent;       }          public void callTrailer()       {           if (myTrailer != null)               myTrailer.printTicket();       }   }   public class Header extends TicketDecorator {          public Header(Component myComponent)       {           super(myComponent);       }          public void printTicket()       {           System.out.println("打印salesTicket的头信息");           super.callTrailer();       }   }   public class Footer extends TicketDecorator {          public Footer(Component myComponent)       {           super(myComponent);       }          public void printTicket()       {           super.callTrailer();           System.out.println("打印salesTicket的页脚信息");       }   }   public class Client   {       public static void main(String[] args)       {           System.out.println("====================================");           new Header(new Footer(new SalesTicket())).printTicket();           System.out.println("====================================");           new Footer(new Header(new SalesTicket())).printTicket();           System.out.println("====================================");       }   }  

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

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

    转载请注明原文地址: https://ju.6miu.com/read-4460.html

    最新回复(0)