模版模式

      模版模式,给类似的,或者使用同一工作流程的产品定义一个模版,尽量减少程序修改时候的成本。

      我们直接使用路虎的例子。现在需要给路虎汽车定义一个模版,能够包含基本的行为和行驶的工作流程。

      整体类图如下:

      

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

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方法进行实现:

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型号的汽车:

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的实现:

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

 

      

posted @ 2014-04-19 15:30  joy06  阅读(177)  评论(0编辑  收藏  举报