zoukankan      html  css  js  c++  java
  • 设计模式之模板方法模式

      模板方法模式为我们定义了一个算法的框架,框架之中定义了方法的执行步骤,但是具体每一步的方法要由具体的子类来实现。这样,在不改变整个算法结构的同时,就可以定义某个算法的特定步骤。

      模板方法模式的类结构如下:


     

     

     

     

     

     

     

     

     

      

      模板函数:在一个抽象基类中定义了一个模板方法,它规定了整个算法的结构并且定义了方法的执行步骤,通过调用若干其他的方法来实现这些步骤。该方法要在类外部被调用执行,所以要声明为public类型。同时,该方法拒绝重写,所以要用final来声明。

      步骤函数:整个算法分为若干个步骤执行,每个步骤由一个步骤方法来实现。如果该步骤的业务比较明确,可以直接在基类中实现为具体方法,由于不希望它在类外被调用,故而要声明为private方法;如果还不明确,则可以将该方法声明为的抽象方法,由继承它的子类来进行复写。为了保证子类可以复写到它,要声明为protected(子类权限)或者default(包内权限)。

    此时我们面对一个问题,如果算法执行这一系列步骤时,希望跳过某个步骤的时候,应该怎么办呢?这时需要在模板方法中提供一个所谓"hook方法",即在每个步骤前加上if判断;该方法提供一个默认实现或者由具体子类去实现,用来控制是否跳过某个具体的步骤,所以要声明为protected或者default。

    使用场景

    • 算法遵循相似的逻辑。
    • 重构代码时,将相同的代码抽取到父类中。
    • 重要的复杂的算法,算法核心可以使用模板算法。

    优点

      封装性好、复用性好、屏蔽细节、便于维护

    缺点

      由于单继承的限制,子类一旦继承了其他父类,就无法继承模板基类了。

  • 相关阅读:
    Apache TomEE 1.5.1 发布,不只是维护更新
    Aspose.Pdf for .NET 7.6.0 发布
    Teiid Designer 8.0 Final 发布
    北大和人大两年整理出来的阅读书单
    关于写博
    Tc中 filter分类器中优先级prio (pref)
    Shell script中eval的使用
    给Linux添加默认路由
    localhost 与 127.0.0.1 的区别
    今天刚开通的博客,很是高兴,新手进入编程世界 ,大家多多指教!
  • 原文地址:https://www.cnblogs.com/cqumonk/p/4147103.html
Copyright © 2011-2022 走看看