模板方法模式
大家好,我是小赵,目前在藏剑山庄任职铸剑师领班,没错,我是领班。
今天给大家演示一手模板方法模式,说实话,这个设计模式我们几乎每个人都在用,只是有些人不知道这种做法有个名称,叫做模板方法模式。
用我的小弟们来做例子吧。
小明干活:
public class XiaoMing { public void doIt(){ System.out.println("小明报道!"); System.out.println("领料中..."); System.out.println("铸剑中..."); System.out.println("小明铸剑完成!"); } }
小红干活:
public class XiaoHong { public void doIt(){ System.out.println("小红报道!"); System.out.println("领料中..."); System.out.println("铸剑中..."); System.out.println("小红铸剑完成!"); } }
例子中虽然是简短的一行行打印,在我们实际工作项目中,可能就是一个个方法,或者是一堆堆代码块。
这里咱们正常优化的时候,肯定会把相同的代码拧出来,做成一个函数大家调,就不用你写一份、我写一份了。其实这就是模板方法模式的核心思想了,就是提取公共代码,把不变的行为搬移到父类,去除子类中重复代码。
我的小弟们干活的流程,其实就相当于一个模板,每个人都要做这些事,所以相同的事情就抽取出来写在模板里,而他们每个人就继承这个模板。
模板类:
abstract class MakeTemplate { protected final void material(){ System.out.println("领料中..."); } protected final void forge(){ System.out.println("铸剑中..."); } abstract void doIt(); }
之所以有final加持,是因为我不想让子类重写方法,这个final并不是模板方法模式的规则,实战中我们都会根据自身的业务情况来决定,必须把模板方法也写成abstract,由子类去实现也有的。
小明干活:
public class XiaoMing extends MakeTemplate { public void doIt(){ System.out.println("小明报道!"); this.material(); this.forge(); System.out.println("小明铸剑完成!"); } }
小红干活:
public class XiaoHong extends MakeTemplate { public void doIt(){ System.out.println("小红报道!"); this.material(); this.forge(); System.out.println("小红铸剑完成!"); } }
在重构代码的时候,可以多考虑模板方法模式,凡是多个子类有共有方法、公有算法、都可以提取出来做成模板,让子类去调用。如果在继承上面没有资源,也可以做成一个公共工具类让大家去调用,一般来说,这是经常使用的玩法。