豆浆制作问题

1)制作豆浆的流程 选材 – 》添加配料 --》浸泡 --》放到豆浆机打碎
2)通过添加不同的配料,可以制作出不同口味的豆浆
3)选材、浸泡和放到豆浆机打碎这几个步骤对于每种口味的豆浆都是一样的
4)模版方法模式比较简单,很容易就想到这个方案,因此就直接使用。

模板方法模式基本介绍

1)模板方法模式(Template Method Pattern),又叫做模板模式(Template Pattern),在一个抽象类定义类执行它的方法的模版。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
2)简单来说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
3)这种类型的设计模式属于行为型模式。

模板方法模式原理类图


原理类图的说明 :
1)AbstractClass抽象类,类中实现类模版方法(template),定义类算法的骨架,具体子类需要去实现,其它的抽象方法operationr2,3,4。
2)ConcreteClass实现抽象方法 operationr2,3,4,以完成算法中特点子类的步骤。

模板方法模式解决豆浆制作问题

1)应用实例要求
编写制作豆浆的程序,说明如下 :
制作豆浆的流程 选材 --》添加配料 --》浸泡 --》放到豆浆机打碎
通过添加不同的配料,可以制作出不同口味的豆浆
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。)
2)类图

package com.example.demo.template;

/**
* 抽象类,表示豆浆
* @author zhaozhaohai
*
*/
public abstract class SoyaMilk { /**
* 模版方法,make,模版方法可以做成final,不让子类去覆盖。
*/
final void make() {
select();
addCondiments();
soak();
beat();
} /**
* 选材料
*/
void select() {
System.out.println("第一步 :选择好的新鲜黄豆 ");
} /**
* 添加不同的配料,抽象方法,子类具体实现
*/
abstract void addCondiments(); /**
* 浸泡
*/
void soak() {
System.out.println("第三步 :黄豆和配料开始浸泡,需要3小时 ");
} void beat() {
System.out.println("第四步 :黄豆和配料放到豆浆机去打碎 ");
}
}
package com.example.demo.template; public class RedBeanSoyaMilk extends SoyaMilk{ @Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println(" 加入上好的红豆 ");
}
}
package com.example.demo.template; public class PeanutSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
// TODO Auto-generated method stub
System.out.println(" 加入上好的花生 ");
}
}
package com.example.demo.template; public class Client {
public static void main(String[] args) {
// 制作红豆豆浆
System.out.println("-- 制作红豆豆浆 --");
SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
redBeanSoyaMilk.make();
System.out.println("-- 制作花生豆浆 --");
SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
}
}

模板方法模式的钩子方法

1)在模板方法模式的父类中,定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
2)还是用上面做豆浆的例子来讲解,比如,制作纯豆浆,不添加任何的配料,使用钩子方法对前面的模版方法进行改造。

package com.example.demo.template;

/**
* 抽象类,表示豆浆
* @author zhaozhaohai
*
*/
public abstract class SoyaMilk { /**
* 模版方法,make,模版方法可以做成final,不让子类去覆盖。
*/
final void make() {
select();
if (customerWantCondiments()) {
addCondiments();
}
soak();
beat();
} /**
* 选材料
*/
void select() {
System.out.println("第一步 :选择好的新鲜黄豆 ");
} /**
* 添加不同的配料,抽象方法,子类具体实现
*/
abstract void addCondiments(); /**
* 浸泡
*/
void soak() {
System.out.println("第三步 :黄豆和配料开始浸泡,需要3小时 ");
} void beat() {
System.out.println("第四步 :黄豆和配料放到豆浆机去打碎 ");
} /**
* 钩子方法,决定是否需要添加配料
* @return
*/
boolean customerWantCondiments() {
return true;
}
}
package com.example.demo.template; public class PureSoyaMilk extends SoyaMilk{ @Override
void addCondiments() {
// TODO Auto-generated method stub
// 空实现
} @Override
boolean customerWantCondiments() {
// TODO Auto-generated method stub
return false;
} }

模板方法模式在Spring框架中的源码分析






下面这两个是钩子方法,默认空实现,让子类去实现。


下面是子类实现的方法

模板方法模式的注意事项和细节

    1. 基本思想是 :算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
    2. 实现类最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
    3. 既统一了算法,也提供类很大的灵活性。父类的模板方法确保类算法的结构保持不变,同时由子类提供部分步骤的实现。
    4. 该模式的不足之处 :每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
    5. 一般模板方法都加final关键字,防止子类重写模板方法。
    6. 模板方法模式使用场景 :当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通车考虑用模板方法模式来处理

图解Java设计模式之模板模式的更多相关文章

  1. JAVA设计模式之模板模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  2. Java设计模式之模板模式(Template )

    前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...

  3. 13.java设计模式之模板模式

    基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...

  4. java设计模式之模板模式以及钩子方法使用

    1.使用背景 模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台.当不可变和可变的方法在子类中混合在一起的时候, 不变的方法就会在子类中多次出现, ...

  5. Java设计模式之模板模式及使用场景

    模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...

  6. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  7. 图解Java设计模式之设计模式面试题

    图解Java设计模式之设计模式面试题 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 1.1.2 设计模式的重要性 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试 ...

  8. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  9. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

随机推荐

  1. javaSE复习之——线程

    线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CP ...

  2. 安装Redis内存分析工具rdbtools

    一.安装Python2.7 1. wget http://10.12.29.98:8090/tools/Python-2.7.11.tgz 2. ln -s /usr/local/python2.7/ ...

  3. elasticsearch 产生未分配分片的原因(es官网)

    Reasons for unassigned shard: These are the possible reasons for a shard to be in a unassigned state ...

  4. SolrJ 的运用

    SolrJ 是操作 Solr 的 Java 客户端,它提供了增加.修改.删除.查询 Solr 索引的 Java 接口.SolrJ 针对 Solr 提供了 REST 的 Http 接口进行了封装, So ...

  5. 阿里凭啥比腾讯更会和Groupon相处好?

    提起Groupon,大部分人对其第一反应就是那个"过气"的团购网鼻祖和与腾讯合作推出的国内团购网站"高朋网",死相极惨!虽然马化腾表示是双方准备不足的原因,但却 ...

  6. Docker部署LAMP项目

    前言 之前我们学习了如何在Linux部署LAMP项目,今天我们来学习一下如何在Docker下部署LAMP项项目吧! Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条 ...

  7. xml模块介绍

      # xml 是一门可拓展的语言 # xml 语法 是用<>包裹的起来的<>就是标签, xml可以由多个<>组成 也可以由单个<>组成, # < ...

  8. js之重写原型对象

    “实例中的指针仅指向原型,而不是指向构造函数”. “重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的关系:它们引用的仍然是最初的原型”.——前记 var fun = function(){ ...

  9. 数据挖掘入门系列教程(四)之基于scikit-lean实现决策树

    目录 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理 ...

  10. 上线前测试的bug,要不要处理,跟版本的关系

    最近有两个项目是在旧版本上实施的.上线前经过一轮测试后,发现了一些产品(我们的产品确实不稳定) 在这个项目上,修改产品bug是肯定的.但是要不要追踪这些bug? 这就跟版本使用范围有关系了,毕竟要考虑 ...