如何让孩子爱上设计模式 ——24.模板方法模式(Template Method Pattern)
标签: 设计模式初涉
描述性文字
终于来到23种设计模式的最后一种:模板方法模式,听名字感觉好像很复杂的样子,
实则不然,先不讲概念,先写个简单的例子,通过例子来感受这个模式。
代码示例
既然是最后一节的了,还是要走一波回忆杀的,还记得之前小猪奶茶店的例子吗?
在工厂方法模式那一章,我们写了奶茶的制作过程过程是如下四步
Image may be NSFW.
Clik here to view.
奶茶的制作过程都是以上四步,我们用模板方法模式来写个例子
先定义一个抽象的模板方法类,这里我还加了一个钩子方法
钩子是一种被声明在抽象类的方法,可以为空或者默认的实现。钩子
的存在可以让子类有能力对算法的不同点进行挂钩,是否需要挂钩由
子类决定。比如这里通过一个标记确定是否需要打包,子类中可以
定义一个方法来调用这个方法,我们在椰果绿茶里重写这个钩子方法。
Image may be NSFW.
Clik here to view.
接着是具体实现类,珍珠红茶 与 椰果绿茶
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
最后客户端调用
Image may be NSFW.
Clik here to view.
输出结果
Image may be NSFW.
Clik here to view.
好的,例子非常简单,概念这些东西也就不难理解了~
概念相关
定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变
一个算法的结构即可冲定义该算法的某些特定步骤。
两个角色
- AbstractClass:抽象模板,定义了模板结构,让子类去具体实现
- ConcreteClass:具体模板,具体实现抽象类的抽象方法
UML类图
Image may be NSFW.
Clik here to view.
使用场景
- 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,
而一些可以改变的细节由其子类来实现。 - 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
- 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
优缺点
优点
- 1.代码复用,相同部分代码放在抽象的父类中
- 2.良好的可扩展性
- 3.反向控制,通过父类调用子类的操作,通过子类的扩展添加新的行为
缺点
需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,
将会导致类的个数增加,系统更加庞大,设计也更加抽象。
本节代码示例
https://github.com/coder-pig/DesignPatternsExample/tree/master/23.Template%20Method%20Pattern