设计模式——模板方法模式

设计模式——模板方法模式

定义一个操做中的算法的框架,而将一些步骤延迟到子类中。使得子类不改变算法结构便可冲定义该算法的某些特定步骤。算法

模板方法模式介绍

也许看定义有些懵逼,可是模板方法模式在设计模式中算是简单的了,仅仅使用了Java的继承机制。可是它的应用是很是普遍的。咱们先举个简单的例子让你们对于模板方法模式有个直观的了解。设计模式

模板方法模式

里面有两个角色bash

  • 抽象模板角色:完成对于基本方法的封装,由子类实现。并有一个方法是模板方法对于基本方法的调用,完成固定的逻辑。
  • 具体模板角色:子类对于基本方法的完善,从而实现父类调用子类方法实现不一样角色不一样的内容。

例如咱们定义个抽象的汽车类,里面有汽车启动、中止、喇叭三个操做。可是每一个汽车的这三个操做都是不一样的。可是向客户演示的时候都是一样操做启动、中止、按喇叭。因此这就是一个典型的模板方法模式。框架

abstract class AbstractCar{
    protected abstract void run();
    protected abstract void stop();
    protected abstract void alarm();

    public final void templateMethod(){
        run();
        stop();
        alarm();
    }
}

复制代码

接下来定义两辆实际的汽车ide

class BmwCar extends AbstractCar{

    @Override
    protected void run() {
        System.out.println("宝马 跑");
    }

    @Override
    protected void stop() {
        System.out.println("宝马 停");

    }

    @Override
    protected void alarm() {
        System.out.println("宝马 喇叭叫");
    }
}


class HmCar extends AbstractCar{

    @Override
    protected void run() {
        System.out.println("悍马 跑");
    }

    @Override
    protected void stop() {
        System.out.println("悍马 停");
    }

    @Override
    protected void alarm() {
        System.out.println("悍马 喇叭叫");
    }
}

复制代码

因此在调用的时候根据不一样的车建立不一样的角色便可spa

AbstractCar bmw = new BmwCar();
        bmw.templateMethod();
        AbstractCar hm = new HmCar();
        hm.templateMethod();

复制代码

抽象模板中的基本方法尽可能设计为protected类型,符合迪米特法则,不须要暴露的属性或者方法尽可能设置为protected类型。设计

模板方法模式的优势

  • 封装不变部分,扩展可变部分:把认为不变部分的算法封装到父类实现,而可变部分的则能够经过继承来继续扩展。
  • 提取公共部分代码,便于维护:若是不将公共部分抽取到父类中,任由散乱分布,最后维护将会形成很大的困扰。
  • 行为由父类控制,子类实现:基本方法由子类实现,所以子类能够经过扩展的方式增长相应的功能。

参考

相关文章
相关标签/搜索