设计模式之模板方法模式

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

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


 

 

 

 

 

 

 

 

 

  

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

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

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

使用场景

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

优点

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

缺点

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

posted @ 2014-12-05 17:09  CQUMonk  阅读(249)  评论(0编辑  收藏  举报