一、引言

23种设计模式大概分为三大类:

5种(创建型模式):工厂方法模式、抽象工厂模式、单例模式、原型模式、建造者模式。

7种(结构型模式):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

11种(行为型模式):策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

行为型又可以通过类与类之间的关系进行划分 :

模板方法模式基本介绍:

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

二、模板方法模式

1.模板方法模式原理类图

对原理类图的说明:

  • AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法 operation2,3,4
  • ConcreteClass 实现抽象方法,假设是operation2,3,4, 以完成算法中特定子类的具体业务步骤

三、具体需求

1.豆浆制作

编写制作豆浆的程序,说明如下:

  • 制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎

  • 通过添加不同的配料,可以制作出不同口味的豆浆

  • 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的

说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式

2. 模板方法模式方案

思路分析 - 类图

具体实现


// 抽象类,表示豆浆  SoyaMilk.java
public abstract class SoyaMilk {// 模板方法:可以做成final,不让子类去覆盖final void make() {select();addCondiment();soak();beat();}//选材料void select() { System.out.println("第一步:选择新鲜的豆子"); }//添加不同的配料:抽象方法,由子类具体实现abstract void addCondiment();//浸泡void soak() { System.out.println("第三步:豆子和配料开始浸泡3H"); }//榨汁void beat() { System.out.println("第四步:豆子和配料放入豆浆机榨汁"); }
}// RedBeanSoyaMilk.java
public class ReadBeanSoyaMilk extends SoyaMilk {@Overridevoid addCondiment() {System.out.println("第二步:加入上好的红豆");}
}// PeanutSoyMilk.java
public class PeanutSoyaMilk extends SoyaMilk {@Overridevoid addCondiment() {System.out.println("第二步:加入上好的花生");}
}// Client.java
public class Client {public static void main(String[] args) {System.out.println("=======制作红豆豆浆=======");SoyaMilk redBeanSoyaMilk = new ReadBeanSoyaMilk();redBeanSoyaMilk.make();System.out.println("=======制作花生豆浆=======");SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();peanutSoyaMilk.make();}
}

3.模板方法模式的钩子方法

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

// RedBeanSoyaMilk.java/PeanutSoyaMilk.java同上,略//抽象类,表示豆浆,SoyaMilk
public abstract class SoyaMilk {//模板方法:可以做成final,不让子类去覆盖final void make() {select();if(customerWantCondiment()) {addCondiment();} soak();beat();}//1.选材料void select() { System.out.println("第一步:选择新鲜的豆子"); }//2.添加不同的配料:抽象方法,由子类具体实现abstract void addCondiment();//3.浸泡void soak() { System.out.println("第三步:豆子和配料开始浸泡3H"); }//4.榨汁void beat() { System.out.println("第四步:豆子和配料放入豆浆机榨汁"); }//钩子方法:决定是否需要添加配料boolean customerWantCondiment() {return true;//默认情况下是要加配料的}
}// PureSoyaMilk.java
public class PureSoyaMilk extends SoyaMilk {@Overridevoid addCondiment() {// 添加配料的方法 空实现 即可}@Overrideboolean customerWantCondiment() {return false;}
}// Client.java
public class Client {public static void main(String[] args) {System.out.println("=制作纯豆浆=");SoyaMilk pureSoyMilk = new PureSoyaMilk();pureSoyMilk.make();}
}

四、注意事项和细节

  • 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改

  • 好处:

    • 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用;
    • 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现
  • 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大

    注意:一般模板方法都加上 final 关键字, 防止子类重写模板方法

  • 模板方法模式使用场景:

    • 当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理

    • 统计某一段代码的执行时间也可以用模板方法模式:在前面打印出代码执行前的时间,后面再打印出代码执行后的时间,中间部分就是不同的执行代码

Java设计模式——模板方法模式【Template Method Pattern】相关推荐

  1. 设计模式之模板方法模式(Template Method Pattern)

    模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤.它 ...

  2. 使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, ...

  3. 模板方法模式(Template Method Pattern)学习笔记

    模板方法模式可以所是最为常见的一种设计模式了,出乎很多人意料的是,很多人已经在他们的代码中用到了模板方法模式而没有意识到自己用到了这个模式,模板方法模式几乎可以在所有的抽象基类中找到. 通过模板方法模 ...

  4. 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分

    文章目录 案例:房屋建造 模板方法模式 模板方法模式与策略模式 总结 完整代码与文档 这个设计模式过于简单,所以不是很好举例- 案例:房屋建造 假设我们是建筑公司中的规划者,负责设定建筑方案,在初期我 ...

  5. 模板方法模式(Template Method Pattern)

    模板方法模式: (就是在抽象基类中定一个复用的方法!) 在一个方法中定一个算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以再不改变算法结构的情况下,重新定义算法中的某些步骤. 实例: 泡茶 ...

  6. Net设计模式实例之模板方法模式(Template Mothed Pattern)(1)

    一.模板方法模式简介(Brief Introduction) 模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不 ...

  7. JAVA设计模式(14) —行为型模板方法模式(Template Method)

    1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...

  8. java 模板方法_设计模式(java实现)_模板方法模式(Template method)

    设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...

  9. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  10. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

最新文章

  1. 用eclipse生成可运行jar包、启动jar包及常见错误
  2. PCM数据格式(转)
  3. linux查看java进程cpu占用过高
  4. jmeter录制 过滤_Jmeter脚本录制
  5. C/C++基础面试-Const的全面理解(C部分)
  6. web系统找回密码流程
  7. 【操作系统真象还原】Mac安装配置bochs
  8. java xheditor,xhEditor不能支持本map片上传,请问
  9. 计算机上怎么计算x的n次方,计算x的n次方
  10. word转excel排版不变怎么转?
  11. Xposed模块 -- Hook函数参数
  12. 如何保养笔记本的电池
  13. 齐岳功能化玻片(载玻片和盖玻片)
  14. cad偏移后自动变色lisp_高手帮忙修改,批量偏移 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  15. 基于STC51:四轴飞控开源项目原理图与源码(入门级DIY)
  16. 佛曰:心底清净方为道
  17. elon函数_Elon Mussk的Neuroink真是令人难以置信
  18. 3.GoolgeProtoBuffer序列化反序列化
  19. 区块链:对链式结构型 PoS 系统的 “虚假权益” 攻击
  20. Python数据分析前景如何

热门文章

  1. OSChina 周六乱弹 —— 感冒晚期
  2. 虚拟化技术 — Libvirt 异构虚拟化管理组件
  3. docker中使用声卡设备
  4. 手把手带你写一份优秀的开发求职简历(八)写一个项目经历
  5. 如何在微博引流?在微博上怎么推广?微博引流变现技巧
  6. 工作流中如何返回上一步
  7. 美国保健品品牌介绍之Now Foods
  8. 为什么电脑一插U盘就蓝屏?
  9. linux脚本基础详细介绍
  10. 《与乔布斯一起领导苹果》|读书笔记