模板方法模式为我们定义了一个算法的框架,框架之中定义了方法的执行步骤,但是具体每一步的方法要由具体的子类来实现。这样,在不改变整个算法结构的同时,就可以定义某个算法的特定步骤。
模板方法模式的类结构如下:
模板函数:在一个抽象基类中定义了一个模板方法,它规定了整个算法的结构并且定义了方法的执行步骤,通过调用若干其他的方法来实现这些步骤。该方法要在类外部被调用执行,所以要声明为public类型。同时,该方法拒绝重写,所以要用final来声明。
步骤函数:整个算法分为若干个步骤执行,每个步骤由一个步骤方法来实现。如果该步骤的业务比较明确,可以直接在基类中实现为具体方法,由于不希望它在类外被调用,故而要声明为private方法;如果还不明确,则可以将该方法声明为的抽象方法,由继承它的子类来进行复写。为了保证子类可以复写到它,要声明为protected(子类权限)或者default(包内权限)。
此时我们面对一个问题,如果算法执行这一系列步骤时,希望跳过某个步骤的时候,应该怎么办呢?这时需要在模板方法中提供一个所谓"hook方法",即在每个步骤前加上if判断;该方法提供一个默认实现或者由具体子类去实现,用来控制是否跳过某个具体的步骤,所以要声明为protected或者default。
使用场景
-
算法遵循相似的逻辑。
-
重构代码时,将相同的代码抽取到父类中。
-
重要的复杂的算法,算法核心可以使用模板算法。
优点
封装性好、复用性好、屏蔽细节、便于维护
缺点
由于单继承的限制,子类一旦继承了其他父类,就无法继承模板基类了。