设计模式—模板方法模式

移动开发 waitig 516℃ 百度已收录 0评论

定义

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,改变定义算法中的某些步骤。

理解

就拿汽车厂组装汽车来说,同一款车通常情况下分为低配和高配,低配中控是小屏幕,轮毂16寸,高配中控是触摸大屏,轮毂也是18寸。但是车厂在生产这两个型号的车时的都是走流水线,装配顺序大致一致。流水线在走到装配中控的位置的时候,低配车装小屏幕,高配车装大屏。流水线又走到了装轮毂的位置,这时候低配装16寸,高配装18寸。

这个例子中,装配汽车的流水线就是“模板方法”,子类低配车、高配车,在不改变装配流程的情况下,改变了装配屏幕和装配轮子的方法。

模板方法模式一共有两个角色:抽象类、子类。

  • 抽象类:例子中的生产线,定义了算法的框架。
  • 子类:例子中的低配车生产线和高配车生产线,在不改变算法框架的情况下,定义算发的具体步骤。

代码

抽象类:生产线类。

public abstract class Pipeline {

    final void install(){
        installFrame();
        installController();
        installTire();
    }

    public void installFrame(){
        Log.e("ZXK","生产车体");
    }

    public abstract void installController();

    public abstract void installTire();
}

子类:低配生产线和高配生产线。

public class GeneralPipeline extends Pipeline {
    @Override
    public void installController() {
        Log.e("ZXK","安装---中控小屏幕");
    }

    @Override
    public void installTire() {
        Log.e("ZXK","安装---16寸轮毂");
    }
}

public class DeluxePipeline extends Pipeline {
    @Override
    public void installController() {
        Log.e("ZXK","安装---中控大屏幕");
    }

    @Override
    public void installTire() {
        Log.e("ZXK","安装---18寸轮毂");
    }
}

测试:

GeneralPipeline generalPipeline = new GeneralPipeline();
DeluxePipeline deluxePipeline = new DeluxePipeline();

generalPipeline.install();
deluxePipeline.install();

这里写图片描述

UML图

这里写图片描述

钩子

钩子是一种被声明在抽象类中的方法,但是只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。

继续上面的例子,高配车型车顶上有行李架,低配车没有,这就是一种钩子。

抽象方法和钩子的区别:

  • 所有子类都有的过程,只是实现不同,用抽象方法。
  • 有的有,有的没有,用钩子。

总结

当子类必须提供算法中某个方法或步骤的实现时,用抽象类。如果算法的这个部分是可选的,就用钩子。如果是钩子,子类可以选择实现这个钩子,但是并不强制。

模板方法模式和策略模式的区别:模板方法模式是在抽象类中定义算法的大纲,通过继承让子类定义其中某些步骤的内容。策略模式通过对象的组合,让客户可以选择算法的实现,就像PC上的USB接口,可以选择插鼠标、键盘、移动硬盘,更注重“组合”。


本文由【waitig】发表在等英博客
本文固定链接:设计模式—模板方法模式
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)