[模板方法模式]:泡妞泡茶泡咖啡,都是泡嘛!

261 阅读4分钟

初识模板方法模式

模板方法模式(Template Method Pattern)是行为设计模式的一种,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,从而实现算法的部分通用化和部分定制化。

泡茶艺术的传统编程

我们通过一个案例来走进模板方法模式。现在,我们需要完成一杯茶的制作。把内容分步细致化,可以大概得到泡茶的几个步骤:

  • 把水煮沸
  • 用沸水浸泡茶叶
  • 把茶水倒进杯子
  • 加柠檬

像以前一样,使用传统编程思想搭建好我们的框架。

  1. 定义一个构造函数Tea作为我们的 抽象类(Abstract Class) :它定义了一个或多个抽象操作,这些操作形成了一个算法框架。同时,它还定义了一个模板方法,这个模板方法定义了算法的主要骨架,并调用前面提到的抽象操作。Tea中有基本的属性,输出我们在泡一杯怎样的茶,Tea是一个可执行对象,构建我们的对象 ,this指向的这些属性就是实例的属性模板。
function Tea (type) {
    this.type = type
    console.log('您准备泡一杯' + this.type);
}
  1. 通过new关键字来运行几个实例对象,也就是 具体子类(Concrete Class) :它实现了抽象类所声明的抽象操作,具体子类中的实现填充了算法中留下的空白,即完成算法中不同的具体步骤。Tea和greenTea以及wlTea没有“血缘关系”,Tea是构造函数。
var greenTea = new Tea('绿茶')
var wlTea = new Tea('乌龙茶')
  1. Tea可以使用prototype关键字来添加一些方法,都可以和以它为原型的对象共享(public)。当一个函数作为构造函数(使用new关键字)创建新对象时,新创建的对象的内部Prototype(也就是常说的__proto__)会指向该构造函数的prototype对象。
Tea.prototype.boilWater = function() {
    console.log('把水煮沸');
}
Tea.prototype.steepTeaBag = function() {
    console.log('用沸水浸泡茶叶');
}
Tea.prototype.pourInCup = function() {
    console.log('把茶水倒进杯子');
}
Tea.prototype.addLemon = function() {
    console.log('加柠檬');
}

image.png












  1. 但是这样很明显太麻烦,总不能每次泡一壶茶就去调用一次各个方法吧,所以就用到了接口,模板方法接口的思想,把各个步骤归于一个大的方法。
Tea.prototype.init = function() {
    this.boilWater()
    this.steepTeaBag()
    this.pourInCup()
    this.addLemon()
}

greenTea.init()
wlTea.init()

通过这种方式,模板方法模式提供了一个不变的算法结构,并允许子类为算法中的某些步骤提供多种实现,增加了代码的复用性和灵活性。新增饮料类型时,只需要继承抽象类并实现特有的步骤即可,无需改变整体的流程结构。

用AIGC实现泡茶艺术

经典的设计模式,模板方法模式竟然也可以和AIGC结合,那将诞生如何强大而又富有生机且令人意想不到的力量!

像之前一样引入所需模块,搭建好基本的框架后。将我们的泡茶步骤更加详细地写入文本中,再设计我们的peompt。这里给它准确的边界范围,精确的指示和模板示例。最后看看与AIGC结合而成的编程思想带给我们怎样的体验。

 const text = `
    泡一杯茶很容易。首先,需要把水烧开。
    在等待期间,拿一个杯子并把茶包放进去。
    一旦水开了,就把它倒在茶包上。
    等待一会儿,让茶包浸湿,几分钟后,取出茶包。
    如果您愿意,可以加一些牛奶或糖调味。
    就这样,您可以享受一杯美味的茶了。
`
const prompt = `
    您将获得由三个引号括起来的文本。
    如果它包含一系列的指令,则需要按照一下格式重新编写这些指令。

    第一步 - 。。。。
    第二步 - 。。。。
    。。。。
    第N步 - 。。。。

    如果文本中不包含一些系列的指令,则直接写“未提供步骤”。
    """${text}"""
`

image.png






今天的内容希望能够令你有所收获,让我们一起加油,一起变强!