模版方法模式
何为模版设计模式
想象一下 如果我们要泡一杯茶 我们要循序渐进地
- 煮水温杯
- 注水浸茶
- 茶水入杯
- 加点配料
如此,泡茶的工序就完成了,那么模板方法模式,相信各位也有了一定的概念:定义了一个算法的骨架,而将一些步骤延迟到子类中实现。这样,子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
也就是说 不问你泡什么茶 一些步骤都是不可省略的 那么既然如此 我们就把这些重复的步骤包装起来成为一个骨架 我们需要的时候 就直接用它 当然你也可以加枸杞 或者加柠檬 可以重新定义
代码实现
// 定义 Tea 构造函数,用于创建泡茶的对象
function Tea(type,add) { this.add=addthis.type = type; console.log('你准备泡一杯' + this.type);
}
Tea 和其它茶之间没有血缘关系 Tea是原型对象 是可执行对象 负责构建对象 this指向的这些属性就是实例的属性模板
原型
每个JavaScript对象都有一个与之关联的原型(prototype) 这个原型也是一个对象 当试图访问对象的某个属性时 如果对象本身没有这个属性 JavaScript引擎会自动查找对象的原型链 直到找到该属性或者到达原型链的末端
原型链:
原型链是JavaScript实现继承的主要方式 当创建一个对象时 JavaScript引擎会为这个对象设置一个原型 指向其构造函数的原型对象 如果原型对象本身也是一个对象 它也有自己的原型 这样就形成了一个链式结构 称为原型链
Tea通过prototype
属性添加方法 以他为原型的对象可以共享
// 在 Tea 对象中使用 prototype 添加方法
Tea.prototype.boilWater = function () {console.log("把水煮沸")
}
Tea.prototype.steepBag = function () {console.log("用沸水浸泡茶叶")
}
Tea.prototype.pourInCap = function () {console.log("把茶水倒进杯子")
}
Tea.prototype.addtive = function () { if (this.add!=null) {console.log("加"+this.add)}elseconsole.log("未添加")
}
// 定义模板方法 init,它定义了泡茶的整个流程
Tea.prototype.init = function () { this.boilWater(); this.steepBag();this.pourInCap(); this.addtive(); }
// 实例化
var greenTea = new Tea('绿茶','蜂蜜');
var wlTea = new Tea('乌龙茶');
// 调用模板方法 init 来执行泡茶的流程
greenTea.init();
这样 我们就可以在各种茶里面加如我们想要的配料 当然 我们还有可以有很多想法 思绪是自由的
优点
- 封装不变部分,扩展可变部分:模板方法模式将不变的行为搬移到父类中,去除子类中的重复代码,使得子类可以专注于实现自己的特定步骤。
- 提供了一个很好的代码复用平台:通过模板方法,子类可以复用父类中的代码,同时也可以添加新的行为。
模版模式毫无疑问是很有挖掘价值的,但写到这里 我想到要完成这样一个任务 我们大模型似乎也可以…
//require是node里面的关键字 引入模块
//从本地 node_moudles 引入openai模块
const OpenAI = require('openai')
require('dotenv').config();
//环境变量
// console.log(process.env.OPENAI_API_KEY,'-------');
const client = new OpenAI({apiKey: process.env.OPENAI_KEY,baseURL: 'https://api.chatanywhere.tech/v1'
})
const getChatResponse = async function (model, prompt) {const response = await client.chat.completions.create({model: model, //适合聊天的模型 指定一种模型messages: [{role: 'user',content: prompt}]})return response.choices[0].message.content
}const main = async () => {const text = `泡一杯茶很容易,首先需要把水烧开。在等待的过程中,把茶包放入一个杯子。一旦水烧开了,就把它倒在茶包上,等待一会,让茶包浸泡,几分钟后,取出茶包,如果你愿意,加一些蔗糖或牛奶调味,就这样,你可以享受一杯每位的茶了`const prompt = `你将获得由三个引号括起来的文本。如果它包含了一系列的指令,则需要按照以下格式重新编写这些指令,第一步 - ...第二步 - ...... - ...如果文本不包含一系列指令 则直接写“未提供步骤”""""${text}"""`const chatCompletion = await getChatResponse('gpt-3.5-turbo', prompt)console.log(chatCompletion);
}main();
是的 大模型也可以很僵单地完成任务 大模型自身就具有很强的自然语言处理能力 我想 应该也可以这样
一个自助教程雏形就这样完成了(▽)
const OpenAI = require('openai')
require('dotenv').config();
const client = new OpenAI({apiKey: process.env.OPENAI_KEY,baseURL: 'https://api.chatanywhere.tech/v1'
})
const getChatResponse = async function (model, prompt) {const response = await client.chat.completions.create({model: model, messages: [{role: 'user',content: prompt}]})return response.choices[0].message.content
}function Tea(type, add) {this.type = type;this.add = add || '无';this.process = `我准备泡一杯${this.type}`;
}Tea.prototype.init = function () {this.process += `,需要添加:${this.add}`;return this.process;
}// 实例化
var greenTea = new Tea('卡布奇诺', "甜甜的你");
const main = async () => {const prompt = `你将获得由三个引号括起来的文本。如果它包含一个制作饮料的想法,请你提供步骤如第一步 - ...第二步 - ...... - ...如果文本不包含一个想法 则直接写“没意思”""""${greenTea.init()}"""`const chatCompletion = await getChatResponse('gpt-3.5-turbo', prompt)console.log(chatCompletion);
}
main();