【设计模式】模板方法模式

简介: 【设计模式】模板方法模式

在面向对象编程的过程中我们常提到重构,将一些重复的代码进行提取封装等,因为重复的代码在一定程度上会造成在编码中容易出错,在编码后难以维护。


同学们手抄试题:


我们通过使用原始的方法来抄两份试题交给老师

1.png


手抄试卷01

class Paper01 {
  constructor() {
    console.log("==========试卷01==========");
  }
  question1(): void {
    console.log("题目01: 窗前明月光,下一句?");
    console.log("答案: ", "疑似地上霜");
  }
  question2(): void {
    console.log("题目02: 鹅鹅鹅,下一句?");
    console.log("答案: ", "曲项向天歌");
  }
  question3(): void {
    console.log("题目02: 长风破浪会有时,下一句?");
    console.log("答案: ", "直挂云帆济沧海");
  }
}


手抄试卷02

class Paper02 {
  constructor() {
    console.log("==========试卷02==========");
  }
  question1(): void {
    console.log("题目01: 窗前明月光,下一句?");
    console.log("答案: ", "疑似地上霜");
  }
  question2(): void {
    console.log("题目02: 鹅鹅鹅,下一句?");
    console.log("答案: ", "曲项向天歌");
  }
  question3(): void {
    console.log("题目03: 臣心一片磁针石,下一句?");
    console.log("答案: ", "不指南方不肯休");
  }
}


上交答案

const paper01 = new Paper01();
paper01.question1();
paper01.question2();
paper01.question3();
const paper02 = new Paper02();
paper02.question1();
paper02.question2();
paper02.question3();


说明

上面的实践可以看出,试卷02中的第三题似乎抄错了,并且两份试卷除了答案会有差异外,题目应该是一致的才是,老师要是需要修改题目的话每个同学又需要一起重抄一遍。


老师准备了一份试卷


老师为我们准了的试卷有助于我们题目的统一

2.png


试卷模板

class PaperBase {
  question1(): void {
    console.log("题目01: 窗前明月光,下一句?");
  }
  question2(): void {
    console.log("题目02: 鹅鹅鹅,下一句?");
  }
  question3(): void {
    console.log("题目02: 长风破浪会有时,下一句?");
  }
}


改造试卷01和02

// 试卷02同试卷01
class Paper01 extends PaperBase {
  constructor() {
    super();
    console.log("==========试卷01==========");
  }
  question1(): void {
    super.question1();
    console.log("答案: ", "疑似地上霜");
  }
  question2(): void {
    super.question2();
    console.log("答案: ", "曲项向天歌");
  }
  question3(): void {
    super.question3();
    console.log("答案: ", "直挂云帆济沧海");
  }
}


说明

通过将试卷01和02共同继承自Base版本,解决了我们题目容易出错的现象,但是在我们的试卷01和02中还是有很多重复的内容同样可以提取到父类中,使得我们的子类中只保留不通的地方,充分的利用我们的父类。


引入模板方法模式


当我们要完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。--【大话设计模式】94页

3.png


基础试卷2.0

abstract class PaperBase {
  question1(): void {
    console.log("题目01: 窗前明月光,下一句?");
    console.log("答案: ", this.answer1());
  }
  question2(): void {
    console.log("题目02: 鹅鹅鹅,下一句?");
    console.log("答案: ", this.answer2());
  }
  question3(): void {
    console.log("题目02: 长风破浪会有时,下一句?");
    console.log("答案: ", this.answer3());
  }
  abstract answer1(): string;
  abstract answer2(): string;
  abstract answer3(): string;
}


再次改造试卷01和02

class Paper01 extends PaperBase {
  answer1(): string {
    return "疑似地上霜";
  }
  answer2(): string {
    return "曲项向天歌";
  }
  answer3(): string {
    return "直挂云帆济沧海";
  }
}


说明

通过模板方法模式使得我们的试卷01和02就只剩下了各自的答案,完成了又一次改造。


模板方法模式


定义一个操作中的算法骨架,将一些步骤延迟到子类。模板方法使得子类可以实现不改变算法结构即可重新定义该算法的特定步骤。

4.png

5.png



相关文章
|
6月前
|
设计模式 算法
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
|
设计模式 存储 算法
行为型设计模式02-模板方法模式
行为型设计模式02-模板方法模式
50 0
|
设计模式 算法
设计模式9 - 模板方法模式【Template Method Pattern】
设计模式9 - 模板方法模式【Template Method Pattern】
37 0
|
设计模式 算法 Java
设计模式~模板方法模式(Template method)-10
目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: (6)Servlet Api &
56 0
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
4月前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
48 6
|
5月前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
168 0
|
6月前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
60 1
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~模板方法模式
[设计模式 Go实现] 行为型~模板方法模式
|
6月前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75