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

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

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


同学们手抄试题:


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

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



相关文章
|
设计模式 算法
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
131 1
|
设计模式 存储 算法
行为型设计模式02-模板方法模式
行为型设计模式02-模板方法模式
107 0
|
设计模式 算法
设计模式9 - 模板方法模式【Template Method Pattern】
设计模式9 - 模板方法模式【Template Method Pattern】
83 0
|
6月前
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
209 13
|
9月前
|
设计模式 SQL 算法
「全网最细 + 实战源码案例」设计模式——模板方法模式
模板方法模式是一种行为型设计模式,定义了算法的骨架并在父类中实现不变部分,将可变部分延迟到子类实现。通过这种方式,它避免了代码重复,提高了复用性和扩展性。具体步骤由抽象类定义,子类实现特定逻辑。适用于框架设计、工作流和相似算法结构的场景。优点包括代码复用和符合开闭原则,缺点是可能违反里氏替换原则且灵活性较低。
221 7
「全网最细 + 实战源码案例」设计模式——模板方法模式
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
111 1
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
119 6
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
155 1
|
设计模式 Go
[设计模式 Go实现] 行为型~模板方法模式
[设计模式 Go实现] 行为型~模板方法模式
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
243 0

热门文章

最新文章