模版方法模式
何为模版设计模式
想象一下 如果我们要泡一杯茶 我们要循序渐进地
- 煮水温杯
- 注水浸茶
- 茶水入杯
- 加点配料
如此,泡茶的工序就完成了,那么模板方法模式,相信各位也有了一定的概念:定义了一个算法的骨架,而将一些步骤延迟到子类中实现。这样,子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
也就是说 不问你泡什么茶 一些步骤都是不可省略的 那么既然如此 我们就把这些重复的步骤包装起来成为一个骨架 我们需要的时候 就直接用它 当然你也可以加枸杞 或者加柠檬 可以重新定义
代码实现
// 定义 Tea 构造函数,用于创建泡茶的对象
function Tea(type,add) {
this.add=add
this.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)
}
else
console.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();