设计模式 - 模版方法
场景
小张的团队最近接受一个需求,实现实现一家咖啡店的冲泡咖啡和茶的冲泡自动化。之前这家咖啡店都是由咖啡师傅手动进行调制咖啡和茶。现在咖啡店需要引入自动化的点单和调制饮料的系统,小张负责实现调制饮料的功能。

咖啡师傅手工冲泡咖啡和茶的流程:

冲泡咖啡:

把水煮沸
用沸水冲泡咖啡
把咖啡倒入杯子
加糖和牛奶
冲泡茶:

把水煮沸
用沸水冲泡茶叶
把茶倒入杯子
加柠檬
小张先简单的想了一下, 如果直接实现程序,那么新建调制咖啡和调制茶的对象,在每个对象里面实现上述步骤。这样想了之后小张本想直接实现,但是由于信心不足,找老王帮他code review一下思路。 老王说,小张啊,你这实现也可以,不过不够优雅啊,你在仔细看一下上述步骤,有没有发现重复或者共性。

小张听了老王的话,觉得自己的设计应该太粗暴了,按照老王的引导,小张仔细看了上述步骤,发现上述步骤,1和4 是很相像的。4(加糖和牛奶/加柠檬)步骤相当于增加调料本质是相同的。那么他应该封装一下冲泡咖啡/茶的步骤算法。

找出共性进行封装,减少重复代码,使系统达到维护和扩展成本很低的状态。

老王夸奖到,很不错嘛,小张你已经慢慢的了解了面向对象(OOP)及使用设计模式的原因。你可以了解一下模版方法。

模版方法
模版方法实现冲泡咖啡
小张去了解了一下模版方法。针对上述冲泡步骤进行了思考。

应该有一个抽象的对象来描述冲泡饮料这一行为,并且抽象的类实现了具体冲泡对象的共性步骤也就是1.把水煮沸和3.把饮料倒入杯子。有两个具体的子类来具体实现冲泡茶和咖啡。
并且有些客户不需要加调料,那么需要对最后一步进行判断,是否添加调料。

我们来看一下小张的类图:

模版方法:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤。

代码实现
冲泡饮料的抽象类
package xuelongjiang.designpartten.templatemethod;

/**
*

  • 模板方法

  • @Author xuelongjiang
    */
    abstract public class CaffeineBeverage {

    //算法。 抽象类的算法是final 的不允许被子类修改
    public final void prepareRecipe(){

      //算法的具体步骤boilWater(); //烧水brew();//冲泡pourInCup();// 把饮料倒入杯子if(hook()){addCondiments();// 加调料}
    

    }

    public abstract void brew();

    public abstract void addCondiments();

    public void boilWater(){

     System.out.println("烧水");
    

    }

    public void pourInCup(){
    System.out.println(“把饮料倒入杯子”);
    }

    /**

    • 钩子,具体实现可以对算法步骤做一些控制
    • @return
      */
      public boolean hook(){
      return true;
      }

}
可以看到我们在冲泡咖啡/茶的抽象类中有一个hook方法,这个方法就是钩子方法。默认返回true,如果冲泡咖啡默认是加调料的那么子类就不用重写hook方法。

咖啡类
package xuelongjiang.designpartten.templatemethod;

/**

  • @Author xuelongjiang
    */
    public class Coffee extends CaffeineBeverage {

    @Override
    public void brew() {
    System.out.println(“用沸水冲泡咖啡粉”);
    }

    @Override
    public void addCondiments() {
    System.out.println(“加糖和牛奶”);
    }

    @Override
    public boolean hook() {
    return super.hook();
    }
    }
    茶类
    package xuelongjiang.designpartten.templatemethod;

/**

  • @Author xuelongjiang
    */
    public class Tea extends CaffeineBeverage {

    @Override
    public void brew() {
    System.out.println(“用沸水侵泡茶叶”);
    }

    @Override
    public void addCondiments() {
    System.out.println(“加柠檬”);
    }

    @Override
    public boolean hook() {
    return super.hook();
    }
    }

测试类
package xuelongjiang.designpartten.templatemethod;
/**

  • @Author xuelongjiang
    */
    public class TemplateMethodTest {

    public static void main(String[] args) {
    CaffeineBeverage caffeineBeverage = new Tea();
    caffeineBeverage.prepareRecipe();

     System.out.println("-------------------");caffeineBeverage = new Coffee();caffeineBeverage.prepareRecipe();
    

    }
    }

模版方法和策略模式的对比
模版方法:控制算法内部。
策略模式:不同算法的管理。
还记得我们在策略模式中武器示例吗? 拳头,木棍,手枪是实现接口的具体的算法,而不接口的算法内部。

两个模式很相像,但是解决的问题是不同。

要点
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。(即高层组件对低层组件的方式是:别调用我们,我们会调用你们)。

模版方法定义了算法的步骤,把这些步骤的实现延迟到了子类。
模版方法模式为我们提供了一种代码复用的重要技巧。
模版方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
为了防止子类改变模版方法中的算法,可以将模版方法声明为final
模版方法和策略模式都封装了算法,一个用组合(策略模式),一个用继承(模版方法)。

作者:我爱看明朝
来源:CSDN
原文:https://blog.csdn.net/u013565163/article/details/79285617
版权声明:本文为博主原创文章,转载请附上博文链接!

设计模式 - 模版方法相关推荐

  1. 设计模式 模版方法模式 展现程序员的一天

    继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算 ...

  2. 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  3. 设计模式——模版方法

    一.首先记住什么模版方法模式(看后面的代码理解): 模版方法模式指在一个方法,里面包含了一个多步骤的算法骨架,其中一个或者多个步骤允许子类延后实现.允许子类在不修改算法的结构的 前提下,对一个或多个步 ...

  4. Java设计模式——模版方法模式

    1.简介 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template ...

  5. .NET设计模式(16):模版方法(Template Method)

    概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识 ...

  6. 设计模式(三)模版方法(行为型)

    模板方法模式:定义一个算法的执行骨架,将具体的算法实现延迟到子类完成. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的 ...

  7. 详解设计模式:模版方法模式

    模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...

  8. (15)模版方法设计模式

    一.概念 模板设计模式-基于抽象类的,核心是封装算法 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现,使用模板方法模式有Spring.Servlet.AQS等 在一个方法中定义一 ...

  9. 设计模式(九)模版方法模式

    相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 设计模式(四)简单工厂模式 设计模式(五)观察者模式 设计模式(六)代理模式 设计模式(七)装饰模式 ...

  10. 设计模式培训之七:模版方法

    查看本人文章索引请通过http://www.cnblogs.com/seesea125/archive/2012/04/17/2453256.html 一.定义 定义一个操作中的算法的骨架,而将一些步 ...

最新文章

  1. 这些优秀的国产分布式任务调度系统,你用过几个?
  2. MaxCompute用户初体验
  3. win10系统修改Intel VT-x时进入不了BIOS问题
  4. 网络编程学习方法和图书推荐
  5. Android多线程分析之三:Handler,Looper的实现
  6. 浏览器绑架:曾几何时,喜爱的“百度”成为了“流氓”的代名词?- 移除hao123首页...
  7. java中showconfirmdialog_Java实现超市管理系统(含数据库)
  8. java零碎要点001--深入理解JVM_Java的堆内存_栈内存_以及运行时数据区的作用
  9. 统计机器学习导论第四章答案
  10. 计算机快捷键屏幕保护是什么原因,电脑屏幕保护_电脑屏幕保护快捷键
  11. Python打印九九乘法表
  12. RINEX3文件中的toc,toe,IODE
  13. css3动态渐变动画
  14. item2vec--word2vec在推荐领域的使用
  15. CTF(二)DES中的S盒
  16. ICDAR 2017 数据集介绍
  17. 优秀IT项目经理的六大特质_转帖IT专家网
  18. 半导体器件基础07:三极管基础(3)
  19. TLS-SRTP协议详解
  20. 黑马内部资料,不加密,直接看!快领取

热门文章

  1. c语言程序与结构,c语言基础与顺序结构-c语言程序设计.ppt
  2. KMP算法------字符串匹配问题
  3. 活动推荐 | 首届云原生编程挑战赛开始报名啦~
  4. Kotlin实战【六】Kotlin中集合的创建
  5. path和classpath的区别
  6. java web教室管理系统_“真香”教程,455集全套java视频教程,自己拿走去学习吧...
  7. nodejs如何实现ajax,nodejs + express怎么实现Ajax方式及其简单功能
  8. android eclipse 运行项目设置程序默认安装到sd卡,Android eclipse 运行项目设置程序默认安装到SD卡...
  9. html的经典语法大全,HTML语法大全
  10. html判断sql没结果,SQL存储过程测试(8)——当待测存储过程没有返回值的时候 如何判断测试结果是否通过...