1.模板方法模式的定义:

定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.模板方法模式的优点:

● 封装不变部分,扩展可变部分。把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。

● 提取公共部分代码,便于维护。我们下面的例子中刚刚走过的弯路就是最好的证明,如果我们不抽取到父类中,任由这种散乱的代码发生,想想后果是什么样子?维护人员为了修正一个缺陷,需要到处查找类似的代码!

● 行为由父类控制,子类实现。基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原 则。

3. 模板方法模式的缺点

按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目 中,会带来代码阅读的难度,而且也会让新手产生不适感。

4.模板方法模式的使用场景

● 多个子类有公有的方法,并且逻辑基本相同时。

● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个 子类实现。

● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通 过钩子函数(见“模板方法模式的扩展”)约束其行为。

5.模板方法模式通用类图如下:

其中AbstractClass是一个抽象的父类,也叫抽象模板类,包含两种类别的方法:基本方法和模板方法。

● 基本方法:基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。

● 模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度, 完成固定的逻辑。

注意: 为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。

另外,ConcreteClass1和ConcreteClass2属于具体模板,实 现父类所定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。

6.代码实现

接下来我们看代码实现:

定义AbstractClass抽象模板类:

package myJavaSchema.模板方法.test01;public abstract class AbstractClass {//基本方法protected abstract void doSomething();protected abstract void doAnything();//模板方法public void templateMethod(){this.doSomething();if(this.isDoAnything()) {this.doAnything();}System.out.println(this.toString());}public boolean isDoAnything(){return true;}}

具体模板:

package myJavaSchema.模板方法.test01;public class ConcreteClass1 extends AbstractClass{private  boolean isFlag = true;@Overrideprotected void doSomething() {System.out.println("我是1 doSomething");}@Overrideprotected void doAnything() {System.out.println("我是1 doAnything");}@Overridepublic boolean isDoAnything() {return this.isFlag;}//要不要doAnything,使用时决定protected void setIsDoAnything(boolean isDo){this.isFlag = isDo;}
}
package myJavaSchema.模板方法.test01;public class ConcreteClass2 extends AbstractClass{@Overrideprotected void doSomething() {System.out.println("我是2 doSomething");}@Overrideprotected void doAnything() {System.out.println("我是2 doSomething");}@Overridepublic boolean isDoAnything() {return false;}
}

写一个测试类:

package myJavaSchema.模板方法.test01;public class Client {public static void main(String[] args) {AbstractClass class1 = new ConcreteClass1();AbstractClass class2 = new ConcreteClass2();((ConcreteClass1) class1).setIsDoAnything(false);class1.templateMethod(); //输出this代表的对象System.out.println(class1.toString());class2.templateMethod(); //输出this代表的对象System.out.println(class2.toString());new Client().test();}
}

测试结果:

我是1 doSomething
myJavaSchema.模板方法.test01.ConcreteClass1@1b6d3586
myJavaSchema.模板方法.test01.ConcreteClass1@1b6d3586
我是2 doSomething
myJavaSchema.模板方法.test01.ConcreteClass2@4554617c
myJavaSchema.模板方法.test01.ConcreteClass2@4554617c

java设计模式 之 模板方法模式相关推荐

  1. Java设计模式之模板方法模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  2. Java 设计模式之模板方法模式

    一.了解模板方法模式 1.1 什么是模板方法模式 模板方法模式 Template Method Parrern)在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变 ...

  3. JAVA设计模式之--模板方法模式

    序言 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单.在这三个 ...

  4. 从西天取经的九九八十一难来看Java设计模式:模板方法模式

    模板方法模式 示例 模板方法模式 定义 意图 主要解决问题 适用场景 优缺点 西天取经的九九八十一难 示例 当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤, 但一些步骤,不同的子类有 ...

  5. Java设计模式之——模板方法模式

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

  6. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

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

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

  8. 【Java】设计模式之模板方法模式

    - 好记性不如烂笔头,特将设计模式之模板方法模式记录在我的小仓库. 文章目录 什么是模板方法模式 案例 什么是模板方法模式 简而言之就是一套算法可以适用于多个类,则进行的步骤汇总,让子类别在不改变算法 ...

  9. Java中的模板方法模式

    模板方法模式是一种行为模式,建议在超类中更一般地定义算法. 该算法是在称为模板方法的方法中定义的. 子类仅定义更具体的算法步骤的实现. 使用这种设计模式的好处是,算法后面的任何更改只会影响超类中的代码 ...

最新文章

  1. 使用Redisson优雅关闭订单
  2. java-OOP-抽象类和接口
  3. 支持下一代分布式应用链开发的区块链服务互联网
  4. GitHub 版本控制 项目托管 02 搭建GitHub运行环境
  5. Atitit java zip compress use apache tool jar 压缩的问题 static void zip(java.lang.String zipFileName,
  6. android mdpi对应哪一个屏幕,Android屏幕大小为ldpi,mdpi,hdpi,xhdpi显示? - 例如:ldpi为1024X768像素...
  7. Windows 2012 R2 操作系统搭建DHCP-HA集群
  8. Pure Strategy Game
  9. UWB技术的工作原理
  10. Android应用向su申请root权限,以及Superuser进行授权管理的原理浅析
  11. VC浏览器相关的学习(六)(IDispEventImpl包装的主要方法)
  12. macw资讯:MacOS如何隐藏、加密文件或文件夹
  13. 黄仁勋:GPU,打折!
  14. 探索C语言之字符串分割函数:strtok和strsep的区别
  15. Windows xp sp3简体中文正式版下载地址
  16. 关于void show(int b),void show(int b)与void show(int* b)的区别的举例与注解
  17. python中的结束用语_python结束语句
  18. PHP-获取目录中的所有文件和子目录
  19. 2023年全国最新会计专业技术资格精选真题及答案3
  20. 蓝桥杯python-找单词出现次数最多的字母

热门文章

  1. iOS 普陀大学堂APP隐私政策
  2. 3G UMTS与4G LTE核心网(二):4G网络概述
  3. 创业公司考勤管理如何做到快准狠!
  4. Python实现淘宝卖家价格分析,淘宝卖家必会的操作!
  5. 初识C语言(三)--最终章,万字解析,趣味讲解完C语言的最后知识点
  6. NVP2650和NVP2650D的区别是什么?
  7. 画世界怎么用光影_怎么绘制光影?插画人物光感的塑造教程
  8. 系统集成项目管理工程师高频考点(第九章)
  9. 大数据独角兽Palantir之核心技术探秘
  10. 从工具了解大数据之Kettle