设计模式(二十二)模板模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/niunai112/article/details/79993473

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112

目录

导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

前言

 抽象模板(Abstract Template):定义一个模板方法,它给出了一个逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,由具体的子类实现,其中各个子类都相同的函数,也在抽象模板中实现。定义抽象操作,让子类实现,它们是一个顶级逻辑的组成步骤。
   具体模板(Concrete Template):实现父类所定义抽象方法,它们是一个顶级逻辑的组成步骤。每一个抽象模板角色都可以有任意多个具体模板角色与之对应,从而使得模板的最终结果各不相同。

例子

      对于饮品店来说,做一份饮品的套路是一样的,我们可以把做饮品的套路定义成模板,肯定要拿杯子,加各种材料,加水(这里的水泛指各种饮料),最后塑封或者加盖。
这里其实塑封的动作是大家都要做的,客人点的饮品不同,在所用的被子,加的材料,和加的水上会有所不同。
所以具体的实现类,要实现拿被子,加材料和加水的方法。

UML图

template

/***
 *
 *@Author ChenjunWang
 *@Description:饮品模板类
 *@Date: Created in 15:56 2018/4/18
 *@Modified By:
 *
 */
public abstract class DrinkTemplate {

    //模板方法
    public void makeDrink(){
        takeBottle();
        addSomething();
        addWater();
        plasticBottle();
    }
    abstract void takeBottle();
    abstract void addSomething();
    abstract void addWater();
    void  plasticBottle(){
        System.out.println("塑封被子");
    }
}


/***
 *
 *@Author ChenjunWang
 *@Description:牛奶饮品类
 *@Date: Created in 16:17 2018/4/18
 *@Modified By:
 *
 */
public class MilkDrink extends DrinkTemplate{
    @Override
    void takeBottle() {

        System.out.println("拿牛奶杯");
    }

    @Override
    void addSomething() {

        System.out.println("加入果肉");
    }

    @Override
    void addWater() {

        System.out.println("加入牛奶");
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:珍珠奶茶饮品类
 *@Date: Created in 16:21 2018/4/18
 *@Modified By:
 *
 */
public class MilkTeaDrink extends DrinkTemplate {
    @Override
    void takeBottle() {
        System.out.println("拿放奶茶的被子");
    }

    @Override
    void addSomething() {

        System.out.println("加入珍珠");
    }

    @Override
    void addWater() {

        System.out.println("加一半牛奶");
        System.out.println("加一半红茶");
    }
}


/***
 *
 *@Author ChenjunWang
 *@Description:测试类
 *@Date: Created in 16:21 2018/4/18
 *@Modified By:
 *
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("--------------要一份牛奶------------------");
        MilkDrink milkDrink = new MilkDrink();
        milkDrink.makeDrink();

        System.out.println("--------------要一份珍珠奶茶------------------");
        MilkTeaDrink milkTeaDrink = new MilkTeaDrink();
        milkTeaDrink.makeDrink();
    }
}

运行结果如下
---------------------------------------------------
--------------要一份牛奶------------------
拿牛奶杯
加入果肉
加入牛奶
塑封被子
--------------要一份珍珠奶茶------------------
拿放奶茶的被子
加入珍珠
加一半牛奶
加一半红茶
塑封被子

总结

优点

 (1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。
 (2)代码可以复用的。

缺点

 (1)每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

随着模板模式的结束,设计模式的学习到这里就结束了,为什么只有22篇,因为LZ工厂和抽象工厂都写在第一篇里面了。不信,各位看官可以去看看。另外各位看官假如能看到这,LZ相信,你们的收获一定蛮大的,加油吧,各位为梦想奋斗的人!

Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/template

回到最上方


有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!

展开阅读全文

没有更多推荐了,返回首页