模板方法模式

  大家好,我是小赵,目前在藏剑山庄任职铸剑师领班,没错,我是领班。

  今天给大家演示一手模板方法模式,说实话,这个设计模式我们几乎每个人都在用,只是有些人不知道这种做法有个名称,叫做模板方法模式。

 

  用我的小弟们来做例子吧。

 

小明干活:

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("小红铸剑完成!");
    }
}

 

  在重构代码的时候,可以多考虑模板方法模式,凡是多个子类有共有方法、公有算法、都可以提取出来做成模板,让子类去调用。如果在继承上面没有资源,也可以做成一个公共工具类让大家去调用,一般来说,这是经常使用的玩法。

 

posted @ 2019-04-23 10:39  不该相遇在秋天  阅读(295)  评论(0编辑  收藏  举报