设计模式系列-模板方法模式

图片

积千里跬步,汇万里江河.每天进步一点点,终有一天将成大佬

文前常规发言

  模板方法的设计符合迪米特法则,也就是最少知道原则,他通过对一些重复方法的封装,减少类之间的耦合,让调用者也更省心,原来要调两三个方法才能实现的功能,现在调一个就可以了;就像我们伟大的祖国,现在也在推行这种模式呢.以前区办一些证明什么的,要跑三四个地方,还要保证这三四个地方都正常帮你办理,如果其中一个地方没办理,那么整个流程就都作废了.现在好了,提倡最多跑一次,只要去一个地方办一次手续就可以了,你只要知道这个地方能办好就行,其他的就不用烦心了;

图片

阿狗卖电脑

  阿狗是一个三十五岁没了头发的年轻小伙,当问及为什么没了头发,阿狗摸摸头,眼里充满了悔恨的泪水;要不是小时候没听大人的话,长大了也不至于做程序员啊---阿狗唉声叹气的说道.听到这里,我仿佛已经知道了答案.当我问他为什么现在改行卖电脑了,他说外面的世界很大,想趁年轻,多闯闯(实则是被公司裁员,被迫来卖电脑了);

图片

看看他的电脑店里都有什么

/**
 * 阿狗电脑店
 * */
abstract class AGouShop {
    /**
     *显卡
     * */
    abstract void xianKa();
    /**
     *cpu
     * */
    abstract void cpu();
    /**
     *电源
     * */
    abstract void dianYuan();
    /**
     *主板
     * */
    abstract void zhuBan();
    /**
     *硬盘
     * */
    abstract void yingPan();
    /**
     *内存条
     * */
    abstract void neiCun();
    /**
     *机箱
     * */
    abstract void jiXiang();
}

还不错,该有的都有了.当我们正在店里逛着时,来了两个顾客,阿猫和大牛,他们都来到阿狗店电脑店,挑选的电脑配件,准备组装电脑.

看看阿猫:

图片

在看看大牛的:

图片

再看看他们怎么组装的吧:

图片

有想法的阿狗

  阿狗自从卖电脑后,发现头上的头发也慢慢的长了出来了,每天也更加自信了.一天,他发现客户有个痛点,就是买电脑要分别买好配件,然后再自己组装,有时候买的配件有问题,又要拿去换,导致费时费力.这时,阿狗头脑灵光一闪,想到了当年做程序员时的模板方法模式;何不把客户组装电脑的步骤自己承包,这样客户只要来买电脑时选下配件,我就帮他组装好给他.客户省心省力,到时候生意肯定好;于是他改造了他的电脑店:

/**
 * 阿狗电脑店
 * */
abstract class AGouShop {
    /**
     *显卡
     * */
    abstract void xianKa();
    /**
     *cpu
     * */
    abstract void cpu();
    /**
     *电源
     * */
    abstract void dianYuan();
    /**
     *主板
     * */
    abstract void zhuBan();
    /**
     *硬盘
     * */
    abstract void yingPan();
    /**
     *内存条
     * */
    abstract void neiCun();
    /**
     *机箱
     * */
    abstract void jiXiang();

    /**
     * 阿狗帮客户装电脑
     * 模板方法
     * */
    public void zhuZHuang(){
        System.out.println("阿狗开始组装电脑======");
        this.cpu();
        this.dianYuan();
        this.neiCun();
        this.xianKa();
        this.yingPan();
        this.zhuBan();
        this.jiXiang();
        System.out.println("阿狗电脑组装完成======");
    }
}

上次的阿猫又来买电脑了:

图片

看看结果:

图片

客户反馈

  阿狗按照上面的模式运行后,缺少增加了不少客户,可是有的顾客却反应说,为什么一定要我选显卡啊,我又不玩游戏,而且我买的cpu有核显,可以不要我选显卡嘛?阿狗一听,这是个问题啊,遵照客户就是上帝的原则(有钱就赚原则),于是他又改了他店铺的模式:

/**
 * 阿狗电脑店
 * */
abstract class AGouShop {
    /**
     * 显卡
     * "具体方法"
     * */
    protected void xianKa(){
        System.out.println("客户选了显卡");
    }
    /**
     * 是否要显卡  默认是要显卡的
     * "钩子方法"
     * */
    public boolean isTrue(){
        return true;
    }
    /**
     *cpu
     * */
    abstract void cpu();
    /**
     *电源
     * */
    abstract void dianYuan();
    /**
     *主板
     * */
    abstract void zhuBan();
    /**
     *硬盘
     * */
    abstract void yingPan();
    /**
     *内存条
     * */
    abstract void neiCun();
    /**
     *机箱
     * */
    abstract void jiXiang();

    /**
     * 阿狗帮客户装电脑
     * 模板方法
     * */
    public void zhuZHuang(){
        System.out.println("阿狗开始组装电脑======");
        this.cpu();
        this.dianYuan();
        this.neiCun();
        //判断要不要显卡
        if(this.isTrue()) {
            this.xianKa();
        }
        this.yingPan();
        this.zhuBan();
        this.jiXiang();
        System.out.println("阿狗电脑组装完成======");
    }
}

可以看到上加了具体方法和钩子方法

上上次的阿猫和大牛,又双来买电脑了-----有钱真好:

阿猫默认要显卡:

图片

大牛不要显卡:图片

看看他们的电脑吧:

图片

总结一下下

上面对比了阿牛的三种买电脑模式

  • 普通模式:自己只提供最基础的东西,所有的由客户自己去完成
  • 自己帮客户完成组装电脑:这里就用到了模板方法模式,通过对自身方法的封装,使客户买电脑更轻松了
  • 客户有选择显卡的权利:这里用到了模板方法模式中的钩子方法,通过客户暴露钩子方法,使其可以控制阿狗在装电脑是要不要装显卡这个步骤方法,钩子方法是模板方法模式的灵魂,有了它,这个模式才有更大的意义;