Fork me on Gitee

Template Method 模板设计模式

什么是模板设计模式

对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关键点 <<模板>> <<材料>>

定义:#

如同我们在父类中定义处理流程的框架,而在子类中实现具体处理的模板称之为template method 模板设计模式

具体到面向对象#

  • <<模板>> 在对象中我们描述为 抽象类: 定义过程pdl
  • <<材料>> 在对象中我们描述为 具体行为的子类:

UML 代码#

  • AbstractDisplay: 定义模板框架,以及具体的过程,此处定义为 打印5吃字符
  • CharDisplay: 子类具体的实现 怎么去打印.
  • StringDisplay: 同上

这里要说明一下,子类应该与父类进行协作开发,因为子类具体去做什么不能随意去写,应该根据父类具体的处理流程去定义相应的处理过程,当然可以把文档写清楚,

  • AbstractDisplay
Copy
package base.template; /** * @program: DesignPatterns * @description: 只实现display方法抽象类 * @author: Mr.Dai * @create: 2018-04-28 16:12 **/ public abstract class AbstractDisplay { public abstract void open(); public abstract void print(); public abstract void close(); /** * 实现打印5次的方法 */ public void display() { open(); for (int i = 0; i < 5; i++) { print(); } close(); } }
  • CharDisplay
Copy
package base.template; /** * @program: DesignPatterns * @description: 实现单个字符的打印 * @author: Mr.Dai * @create: 2018-04-28 16:15 **/ public class CharDisplay extends AbstractDisplay { private Character ch; public CharDisplay(char ch) { this.ch=ch; } @Override public void open() { System.out.print("<<<"); } @Override public void print() { System.out.print(ch); } @Override public void close() { System.out.println(">>>"); } @Override public void display() { super.display(); } }
  • StringDisplay
Copy
package base.template; /** * @program: DesignPatterns * @description: 实现对个字符串打印 * @author: Mr.Dai * @create: 2018-04-28 16:18 **/ public class StringDisplay extends AbstractDisplay { private String string; private int width; public StringDisplay(String string) { this.string = string; this.width = string.getBytes().length; } @Override public void open() { printline(); } private void printline() { System.out.print("+"); for (int i = 0; i < width; i++) { System.out.print("-"); } System.out.println("+"); } @Override public void print() { System.out.println("|"+string+"|"); } @Override public void close() { printline(); } @Override public void display() { super.display(); } }

转移提高#

  • 在java.io.inputstream 使用模板的方法,如下图UML

  • 限于多态的概念,chardisplay stringdisplay 的具体实例都是向上指向的abstractdisplay中的. 无需通过instanceof 制定的具体的子类

  • 由于是通过继承实现 所以遵循的LSP

  • 在子类与父类的协作过程中,必须保证代码量与方法数安排合理, 更多的方法实现放在父类会让子类变得轻松,但是也降低了子类的灵活性.如果父类中实现的方法过少,而且还会导致子类间代码重复出现.

  • 在abstractdisplay 不使用接口而使用抽象类的原因是 需要在定义模板过程的时候 确定相应的算法过程.

相关设计模式

  • Factory Method: 工厂模式 是将template method 模式用于生成实例的一个典型方法
  • Strategy:策略模式 可以使用委托改变的程序的行为,与template method 模式改变部分行为不同的是,他可以作为替换整个算法.

需要掌握的职责

  • 子类角度
    • 在子类中可以使用父类定义的方法
    • 可以在子类增加方法实现新的功能
    • 子类重写父类的方法可以改变父类的行为 一般情况下在定义父类模板的时候 确定是否使用final
  • 父类角度
    • 期待子类实现抽象方法.
    • 要求子类去实现抽象方法.


Copy
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接
posted @   ---dgw博客  阅读(441)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示
CONTENTS