Template pattern模板方法模式
1>模板模式定义了算法的步骤,把这些步骤的实现延续到子类
2>模板模式为我们提供了一个代码复用的技巧
3>模板抽象类中可以定义具体方法、抽象方法和钩子方法
4>为了防止子类改变模板中的算法,可以将模板方法声明为final
5>钩子是一种方法,它在抽象类中不做事,或只做默认的事,子类可以选择要不要实现它
模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。
我们使用冲泡咖啡和冲泡茶的例子
加工流程:
咖啡冲泡法:1.把水煮沸、2.用沸水冲泡咖啡、3.把咖啡倒进杯子、4.加糖和牛奶
茶冲泡法: 1.把水煮沸、2.用沸水冲泡茶叶、3.把 茶 倒进杯子、4.加蜂蜜
实践步骤:
1>创建一个模板(抽象)类:Beverage(饮料)
- package com.kaishengit.beverage;
- public abstract class Beverage {
- /**
- * 冲泡咖啡或茶...流程
- */
- public final void create(){
- boilWater();//把水煮沸
- brew();//用沸水冲泡...
- pourInCup();//把...倒进杯子
- addCoundiments();//加...
- }
- public abstract void addCoundiments();
- public abstract void brew();
- public void boilWater() {
- System.out.println("煮开水");
- }
- public void pourInCup() {
- System.out.println("倒进杯子");
- }
- }
2>创建一个咖啡类(Coffee)和茶(Tea)类,都继承Beverage抽象类
1.咖啡(Coffee)
- package com.kaishengit.beverage;
- public class Coffee extends Beverage{
- @Override
- public void addCoundiments() {
- System.out.println("添加糖和牛奶"); }
- @Override
- public void brew() {
- System.out.println("用水冲咖啡");
- }
- }
2.茶(Tea)
- package com.kaishengit.beverage;
- public class Tea extends Beverage{
- @Override
- public void addCoundiments() {
- System.out.println("添加蜂蜜");
- }
- @Override
- public void brew() {
- System.out.println("用水冲茶");
- }
- }
3.我们测试一下:
- package com.kaishengit.beverage;
- public class Test {
- public static void main(String[] args) {
- Coffee coffee = new Coffee();
- coffee.create();//冲泡咖啡
- //Tea tea = new Tea();//冲泡茶
- //tea.create();
- }
- }
运行结果:
-----------------------------------
煮开水
用水冲咖啡
倒进杯子
添加糖和牛奶
-----------------------------------
在模版模式中使用挂钩(hook)
存在一个空实现的方法,我们称这种方法为”hook”。子类可以视情况来决定是否要覆盖它。
1>我们对模板类(Beverage)进行修改
- package com.kaishengit.beverage;
- public abstract class Beverage {
- /**
- * 冲泡咖啡或茶...流程
- */
- public final void create(){
- boilWater();//把水煮沸
- brew();//用沸水冲泡...
- pourInCup();//把...倒进杯子
- addCoundiments();//加...
- hook();//挂钩
- }
- //空实现方法
- public void hook(){}
- public abstract void addCoundiments();
- public abstract void brew();
- public void boilWater() {
- System.out.println("煮开水");
- }
- public void pourInCup() {
- System.out.println("倒进杯子");
- }
- }
2>假如我们搞活动,喝一杯咖啡送一杯,修改咖啡(Coffee)类
- package com.kaishengit.beverage;
- public class Coffee extends Beverage{
- @Override
- public void addCoundiments() {
- System.out.println("添加糖和牛奶"); }
- @Override
- public void brew() {
- System.out.println("用水冲咖啡");
- }
- /**
- * 挂钩
- */
- @Override
- public void hook() {
- System.out.println("再来一杯");
- }
- }
3>使用上面的测试类
运行结果:
--------------------------------
煮开水
用水冲咖啡
倒进杯子
添加糖和牛奶
再来一杯
--------------------------------
结果中有“再来一杯”...
我们也可以这样使用挂钩,让其决定里面的代码是否执行
1>我们对模板类(Beverage)进行修改
- package com.kaishengit.beverage;
- public abstract class Beverage {
- /**
- * 冲泡咖啡或茶...流程
- */
- public final void create(){
- boilWater();//把水煮沸
- brew();//用沸水冲泡...
- pourInCup();//把...倒进杯子
- //挂钩决定是否添加配料
- if(hook()){
- addCoundiments();//加...
- }
- //hook();
- }
- /**
- * 默认添加配料
- * @return
- */
- public boolean hook() {
- return true;
- }
- //public void hook(){}
- public abstract void addCoundiments();
- public abstract void brew();
- public void boilWater() {
- System.out.println("煮开水");
- }
- public void pourInCup() {
- System.out.println("倒进杯子");
- }
- }
2>我们对Coffee类进行修改,让其不添加配料
- package com.kaishengit.beverage;
- public class Coffee extends Beverage{
- @Override
- public void addCoundiments() {
- System.out.println("添加糖和牛奶"); }
- @Override
- public void brew() {
- System.out.println("用水冲咖啡");
- }
- /**
- * 有的客人不喜欢加配料
- */
- @Override
- public boolean hook() {
- return false;
- }
- /*@Override
- public void hook() {
- System.out.println("再来一杯");
- }
- */
- }
3>还是使用上面的测试类
运行结果:
------------------------------------------------------
煮开水
用水冲咖啡
倒进杯子
------------------------------------------------------
运行结果中没有添加配料
关于模板模式
1>模板模式定义了算法的步骤,把这些步骤的实现延迟到子类
2>模板模式为我们提供了一个代码复用的技巧
3>模板抽象类中可以定义具体方法、抽象方法和钩子方法
4>为了防止子类改变模板中的算法,可以将模板方法声明为final
5>钩子是一种方法,它在抽象类中不做事,或只做默认的事,子类可以选择要不要实现它
Template pattern模板方法模式的更多相关文章
- 设计模式13:Template Method 模板方法模式(行为型模式)
Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...
- 设计模式 : Template method 模板方法模式 -- 行为型
设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...
- Template Method - 模板方法模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- 设计模式(22)--Template Method(模板方法模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声 ...
- 设计模式学习笔记——Template Method模板方法模式
可能是最简单的设计模式. 而且你我都用过而不自知. 因为,模板方法模式也者,就是面向对象中的继承.公用部分放在父类,子类继承父类,然后扩展.呵呵.
- 设计模式C++学习笔记之九(Template Method模板方法模式)
模板模式也是相当简单的一种模式,而且是比较常用的.模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些 ...
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
- 深入浅出设计模式——模板方法模式(Template Method Pattern)
模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式 ...
- 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释
模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...
随机推荐
- Python Network Programming
@1: 同步网络编程(也就是阻塞方式) 同步网络编程一次只能连接一个客户端. Server端: import socket def debugPrint(name, value): print(&qu ...
- iOS数据存储到本地的几种方法
A,归档解档(多针对于模型或者数组,利用MJExtension) 1,先在model里的.m文件写上MJCodingImplementation 2,再进行模型归档: #define APP_DOCU ...
- Java集合(8):Hashtable
一.Hashtable介绍 和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射,它在很大程度上和HashMap的实现差不多. Hashtable ...
- Nodejs学习计划
此文章已经发表于本人博客. 由于公司要求这段时间在学习Nodejs,基本靠自摸一路走来踩了很多坑浪费很多时间,今天就来这里说下,顺便计划一下接下来的学习计划,目前自己做个博客,项目过程中学习了js类以 ...
- 优秀 H5 案例收集 vol.1(不定期更新)
一生要历经的三种战斗http://datang.wearewer.com/ 雍正去哪儿http://news.163.com/college/special/craftsman_h5/ 比Emoji更 ...
- 2062326 齐力锋 实验二《Java面向对象程序设计》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构 班级: 1623 姓名: 齐力锋 学 ...
- 无缝走A的终极技巧:学会了你也是走A怪
ADC重点之中:改键铸造更强走A! 我们先来欣赏一波来自世界顶尖ADC大师兄Doublelift的教科书般的走A. 他使用的金克丝在空蓝的情况下,凭借娴熟的走A技巧,拿下五杀. 关于走A,其实它有着一 ...
- 在Linux系统下使用Github的基本教程
1. 安装git: sudo apt-get install git-core git-gui git-doc 2.到https://github.com/ 注册一个帐号,一会儿客户端登录的时候要使用 ...
- 【I/O】常见输入输出
缓冲输入文件.输出文件 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; ...
- linux下fifo,mq,shm
最近想为系统添加一个统计脚本,但是系统内的模块是有perl和java两种语言编写,且模块是通过crontab定时调用的,所以需要使用IPC传输信息. 第一个想到的是socket方式,感觉需要统一设定一 ...