设计模式之-模板方法模式

1,模板方法模式概念

概念:定义一个操作中算法的框架,而将一些步骤的实现延迟到子类中去。模板方法模式使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。
Template Method Pattern:  Define the skeleton of an algorithm in an  operation, deferring some steps to subclasses. Template Method lets  subclasses redefine certain steps of an algorithm without changing the  algorithm's structure.

模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。
       模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

模板方法模式是通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势,当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一(基类中)的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

2,模板方法结构和实现

模板方法模式结构:

模板方法模式结构比较简单,其核心是抽象类和其中的模板方法的设计。


模板方法模式包含如下两个角色:
       (1) AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
       (2) ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

模板方法具体实现:

在实现模板方法模式中,开发抽象类的工程师和开发具体子类的软件工程师可以协作起来。一个工程师负责算法的逻辑和框架,另一个工程师负责算法基本步骤功能的实现,在子类中实现的这些具体的逻辑步骤的方法就是基本方法,而将这些基本方法而将这些基本方法合并起来的方法就是模板方法模板方法模式名字也由此而来。

模板方法和基本方法:
1)模板方法:
模板方法是一个定义在抽象类中,把基本方法组合在一起形成一个总算法或者总行为的方法。模板方法定义在抽象类中,并且由子类不加修改的完全继承下来。模板方法是一个具体的方法,给出了算法顶层的逻辑框架,而逻辑的具体步骤(即基本方法)在抽象类中可以是具体的方法,也可以是抽象方法,由于模板方法是具体方法,所以模板方法模式中的抽象层只能是抽象类而不能是接口。
2)基本方法:
基本方法是实现模板模式各个步骤的方法,通常在子类中实现,是模板方法的组成部分,基本方法又分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。
a,抽象方法,抽象方法又抽象类声明,由具体的子类去实现的方法。
b,具体方法,具体方法由抽象类或者具体类声明或者实现,子类可以继承也可以覆盖
c,钩子方法,一个钩子方法由具体类或者抽象类声明或者实现,而其子类可以加以扩展,通常父类给出的实现是一个空实现。并以空实现作为方法的默认实现,同时也可以定义成非空实现,
钩子方法又分为两类,第一类钩子方法会影响抽象类中模板方法对不同操作的执行,通常是一个返回值是BOOL类型的函数,在模板函数中通过判断这种钩子函数的返回值来决定到底执行哪种操作,在子类中可以重写抽象类中的钩子方法,重新返回新的值,这样做的好处是,即使子类中不定义这种钩子函数程序也不会报错,而如果把这个函数定义成抽象函数,那么在子类中就必须实现,否则程序会报错。
第二类钩子函数,在抽象类中定义并空实现,在模板函数中调用这个钩子函数,如果子类需要,那么在子类中覆盖这个方法,同样可以对抽象类中模板方法的执行产生影响。
钩子函数主要是体现了子类对父类的一种反向控制,为子类控制父类提供了一种解决方案。

3,模板方法模式的优缺点和使用场景

模板方法模式是一种基于继承的代码复用技术,它体现了面向对象的诸多重要的思想,是一种使用比较频繁的设计模式。模板方法模式广泛的应用于框架设计中,以确保通过父类来控制处理流程的逻辑顺序。

模板模式的优点

1)在父类中形式化的定义一个算法,而由子类来实现细节的处理,在子类中改变算法详细的运算过程时候,并不会改变算法中步骤的执行顺序。
2)模板方法模式是一种代码复用技术,它在类库的设计中尤为重要,它提取了类库中的公共行为,将公共的行为放到父类中,而通过子类来实现不同的行为,它鼓励我们恰当适当的使用继承实现代码复用。
3)可实现一种反向控制结构,通过子类覆盖父类中的钩子方法,来决定某一个步骤是否需要执行,或者为父类的执行增加新的操作。
4)模板方法模式中,通过子类覆盖父类中的基本方法,不同子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。

模板方法模式的缺点

需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致子类数量太多,系统更加庞大,设计也更加抽象,此时可以通过桥接模式来设计

模板方法模式的适用场景

1)对一些复杂的算法进行分割,将算法中固定不变的部分设计为模板方法和父类具体方法,而一些可变的细节的具体实现放到其子类中来实现。即:一次性实现算法的不变部分,并将可变的行为留给子类。
2)各个子类中当有公共行为的时候,应该把公共行为提取出来,放到父类中来实现。
3)需要通过子类来控制父类中的某个方法是否需要执行,实现子类对父类的一种反向控制。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值