模版模式

      模版模式,给相似的,或者使用同一工做流程的产品定义一个模版,尽可能减小程序修改时候的成本。ide

      咱们直接使用路虎的例子。如今须要给路虎汽车定义一个模版,可以包含基本的行为和行驶的工做流程。函数

      总体类图以下:this

      

      汽车的一系列动做能够归纳成:启动汽车,发动机运行,鸣笛,停车。这四个方法是全部汽车都要进行的工做,因此在抽象类中实现。假设全部的汽车都要走这个么流程的,则能够直接在抽象类中实现这些方法调用的封装。启动到停车这几个方法无需对用户可见,则定义为protected便可,run函数将会被调用,但不会被改变,因此,定义为final,spa

package com.cbf4life;

/**
 * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
 *         all. Hummer Model是悍马车辆模型的意思,不是悍马美女车模
 */
public abstract class HummerModel {
    /*
     * 首先,这个模型要可以被发动起来,别管是手摇发动,仍是电力发动,反正 是要可以发动起来,那这个实现要在实现类里了
     */
    protected abstract void start();

    // 能发动,那还要能停下来,那才是真本事
    protected abstract void stop();

    // 喇叭会出声音,是滴滴叫,仍是哔哔叫
    protected abstract void alarm();

    // 引擎会轰隆隆的响,不响那是假的
    protected abstract void engineBoom();

    // 钩子方法,默认喇叭是会响的,子类中能够重载修改
    protected boolean isAlarm() {
        return true;
    }

    // 那模型应该会跑吧,别管是人退的,仍是电力驱动,总之要会跑
    final public void run() {
        // 先发动汽车
        this.start();
        // 引擎开始轰鸣
        this.engineBoom();
        // 喇嘛想让它响就响,不想让它响就不响
        if (this.isAlarm()) {
            this.alarm();
        }
        // 到达目的地就停车
        this.stop();
    }
}
View Code

      H1型号的汽车是H1的特征,对这是个protected方法进行实现:3d

package com.cbf4life;

/**
 * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
 *         all. 悍马车是每一个越野者的最爱,其中H1最接近军用系列
 */
public class HummerH1Model extends HummerModel {
    @Override
    public void alarm() {
        System.out.println("悍马H1鸣笛...");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H1引擎声音是这样在...");
    }

    @Override
    public void start() {
        System.out.println("悍马H1发动...");

    }

    @Override
    public void stop() {
        System.out.println("悍马H1停车...");
    }
}
View Code

      H2型号的汽车:code

package com.cbf4life;

/**
 * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
 *         all. H1和H2有什么差异,还真不知道,真没接触过悍马
 */
public class HummerH2Model extends HummerModel {
    @Override
    public void alarm() {
        System.out.println("悍马H2鸣笛...");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H2引擎声音是这样在...");
    }

    @Override
    public void start() {

        System.out.println("悍马H2发动...");
    }

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

    //H2车型默认的喇叭函数与其余车型不一样,因此这里只需重载
    @Override
    protected boolean isAlarm() {
        return false;
    }
}
View Code

      Client的实现:blog

package com.cbf4life;

/**
 * @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
 *         all. 客户开始使用这个模型
 */
public class Client {
    public static void main(String[] args) {
        // 客户开着H1型号,出去遛弯了
        HummerModel h1 = new HummerH1Model();
        h1.run(); // 汽车跑起来了;
        // 客户开H2型号,出去玩耍了
        HummerModel h2 = new HummerH2Model();
        h2.run();
    }
}
View Code
相关文章
相关标签/搜索