• 设计模式之装饰模式


         《设计模式》一书对Decorator是这样描述的:
      动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式比生成子类更为灵活。

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

    代码如下:

    abstract class Component{
    abstract public void printTicket();
    }
    class SalesTicket extends Component{
    public void printTicket() {
     System.out.println("打印出salesTicket的内容");
    }
    }
    abstract class TicketDecorator extends Component{
    private Component myTrailer;
    public TicketDecorator(Component myComponent){
     myTrailer=myComponent;
    }
    public void callTrailer(){
     if(myTrailer!=null)
     myTrailer.printTicket();
    }
    }
    class Header extends TicketDecorator{
    public Header(Component myComponent){
     super(myComponent);
    }
    public void printTicket(){
     System.out.println("打印salesTicket的头信息");
     super.callTrailer();
     
    }
    }
    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模式的适用场合是,各种可选的功能在另一个肯定要执行的功能之前或之后执行。                                             (部分资料整理于网络)

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    PHP如何采集网站数据
    十一. Go并发编程singleflight
    2. Go中defer使用注意事项
    九. Go并发编程context.Context
    3. Go中panic与recover注意事项
    Go 性能提升tips边界检查
    十.Go并发编程channel使用
    八. Go并发编程errGroup
    十二. Go并发编程sync/errGroup
    Go知识盲区闭包
  • 原文地址:https://www.cnblogs.com/lucari/p/4608581.html
Copyright © 2020-2023  润新知