在软件开发中,有时会遇到类似的情况,某个方法的实现需要多个步骤,其中有些步骤是固定的,而有些步骤并不固定,存在可变性。为了提高代码的复用性和系统的灵活性,可以使用模板方法模式来应对这类情况。
定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
延续着上一篇设计模式(八)外观模式的写法,我们仍旧来举一个武侠的例子,原谅博主是一个武侠迷。
一个武侠要战斗的时候,也有一套固定的通用模式,那就是运行内功、开通经脉、准备武器和使用招式,我们把这些用代码表示就是:
需要注意的是这个抽象类包含了三种类型的方法,分别是抽象方法、具体方法和钩子方法。抽象方法是交由子类去实现,具体方法则在父类实现了子类公共的方法实现,在上面的例子就是武侠开通经脉的方式都一样,所以就在具体方法中实现。钩子方法则分为两类,第一类是15行,它有一个空实现的方法,子类可以视情况来决定是否要覆盖它;第二类则是第9行,这类钩子方法的返回类型通常是bool类型的,一般用于对某个条件进行判断,如果条件满足则执行某一步骤,否则将不执行。
本文就拿张无忌、张三丰来作为例子:
张无忌没有武器所以hasWeapons方法返回false,这样也不会走weapons方法了。
最后张三丰突然肚子不舒服所以就实现了钩子方法hook。
运行结果: 运行九阳神功 开通正经与奇经 使用招式乾坤大挪移 运行纯阳无极功 开通正经与奇经 使用真武剑 使用招式神门十三剑 突然肚子不舒服,老夫先去趟厕所