模版模式

标签: 设计模式


引言

在模板方法模式中,将实现功能的每一个步骤所对应的方法称为基本方法(例如“点单”、“吃东西”和“买单”),而调用这些基本方法同时定义基本方法的执行次序的方法称为模板方法(例如“请客”)。模板方法定义算法执行的骨架,子类继承下来直接使用,一般用final修饰不允许子类修改。

抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,抽象类的好坏直接决定了程序是否稳定。

实现类用来实现细节。抽象类中的模板方法正是通过实现类扩展的方法来完成业务逻辑。只要实现类中的扩展方法通过了单元测试,在模板方法正确的前提下,整体功能一般不会出现大的错误。

类型

行为型模式。

目的

算法的步骤先由抽象类里面提供一个方法写好,具体的细节延迟到子类实现。模板方法使得同一个算法的多个不同实现有一致的框架,而具体区别由子类控制。

UML类结构

模版模式

角色

模板方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:
(1)抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
(2)模板方法:由抽象类声明并加以实现。一般来说,模板方法调用抽象方法来完成主要的逻辑功能,并且,模板方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
(3)钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模板方法的逻辑。例如使用返回布尔变量的方法来控制算法中某些步骤是否执行。

说明

模板模式是一种基于继承的代码复用技术。由于模板方法是具体方法,因此模板方法模式中的抽象层只能是抽象类,而不是接口。

优势

(1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。

(2)代码复用的基本技术,在数据库设计中尤为重要。

(3)存在一种反向的控制结构,通过一个父类调用其子类的操作,通过子类对父类进行扩展增加新的行为,符合“开闭原则”。

不足

每个不同的实现都需要定义一个子类,会导致类的个数增加,系统更加庞大。

具体使用说明

(1)先写一个抽象类,定义几个基本方法,使用abstract修饰,然后定义一个模板方法,模板方法是具体方法,按照一定顺序访问自身的基本方法。

(2)写一个或者多个继承该抽象类的子类,实现所有基本方法即可。

(3)Client端直接调用抽象类类型的对象的模板方法,即可调用这个算法。修改算法具体实现时,只需修改子类或者新增一个子类即可,不用修改Client端的代码。