引言
在开始一个新项目时,我们往往从项目启动、需求分析、设计阶段、详细设计、代码实现、测试验证等阶段来确保项目的顺利进行。泡茶也是如此,想要泡好一杯茶,无论是大红袍、普洱茶、铁观音......,我们都会有一些步骤是相同的,这就是模板方法。
在泡茶中,“泡”被定义为模板方法模式,它封装了“泡”的基本步骤--不变部分,例如:加水进水壶、烧水、倒水,并允许了有“泡”这个过程的工作,添加其他的步骤--可变部分,例如:泡茶中的加柠檬、泡咖啡中的加糖、泡麦片中的加牛奶.....
在Javascript中模板方法模式的实现
知识扩充
JS除了简单数据类型,就是对象(函数式可执行的对象),早期的时候,JS没有提供class关键字,也就是没有类的概念,我们直接操作对的是对象本身,当函数名小写时,就是普通函数(对象),当函数名开头大写时,就为构造函数。
原型式面向对象的创建过程
1、Javascript规定,每一个构造函数都有prototype的属性指向另一个对象,这个对象的所有属性和方法,都会被构造函数的实例对象继承。
var Tea = function(type){
this.type =type;
console.log('您准备泡一杯'+this.type)
}
这里我们创建了一个构造函数,用于创建Tea类型的对象实例var lemonTea = new Tea('柠檬茶')
接着我们用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('加柠檬')
}
然后给对象实例lemonTea加上它自己的方法,最后在调用它的所有方法。
<script>
//原型式面向对象的创建过程
var Tea = function(type){
this.type =type;
console.log('您准备泡一杯'+this.type)
}
//对象 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('加柠檬')
}
//当以new的方式被运行
// var greenTea = new Tea('绿茶');
// var wlTea = new Tea('乌龙茶');
var lemonTea = new Tea('柠檬茶')
lemonTea.boilwater();
lemonTea.steepTeaBag();
lemonTea.pourInCup();
lemonTea.addLemon();
lemonTea.self = function (){
console.log('我是特殊的柠檬茶')
}
lemonTea.self();
</script>
输出到游览器控制台
我们也可以在对象中定义一个init()方法,将封装好的方法统一放入,这样实例对象调用时,只需要调用init()方法就可以了。
Tea.prototype.init = function(){
this.boilwater();
this.steepTeaBag();
this.pourInCup();
this.addLemon();
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>模板方法模式</title>
</head>
<body>
<script>
//原型式面向对象的创建过程
var Tea = function(type){
this.type =type;
console.log('您准备泡一杯'+this.type)
}
//对象 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('加柠檬')
}
//接口,模板方法接口,
Tea.prototype.init = function(){
this.boilwater();
this.steepTeaBag();
this.pourInCup();
this.addLemon();
}
//当以new的方式被运行
// var greenTea = new Tea('绿茶');
// var wlTea = new Tea('乌龙茶');
var lemonTea = new Tea('柠檬茶')
// lemonTea.boilwater();
// lemonTea.steepTeaBag();
// lemonTea.pourInCup();
// lemonTea.addLemon();
lemonTea.self = function (){
console.log('我是特殊的柠檬茶')
}
lemonTea.init();
lemonTea.self();
</script>
</body>
</html>
与AIGC的结合
构建OpenAI,还不会的小伙伴可以移步前期文章【浅谈吴恩达prompt-engineering课--如何构建和利用OpenAI,并准确设计Prompt - 掘金 (juejin.cn)】
有了OpenAI后,就可以快速的得到我们想要的结果。大家都知道,AIGC的优势就是处理文本,生成内容,把分步编程、流程控制型问题,交给大模型,减少流程式代码,提高编写效率。让大模型LLM处理问题最关键的就是prompt的设计,话不多说,让我们直接感受“泡茶”该如何设计我们的prompt。
const OpenAI = require('openai')
require('dotenv').config();
//环境变量
// console.log(process.env,'------');
const client = new OpenAI({
apiKey:process.env.OPEN_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 mian = async()=>{
//AIGC的优势就是处理文本,生成内容
const text = `
泡一杯茶很容易。首先,需要把水烧开。
在等待期间,拿一个杯子并把茶包放进去。
一旦水开了,就把它倒到茶包上。
等待一会,让茶叶浸泡,几分钟后,取出茶包。
如果你愿意,可以加上一些糖或者牛奶调味。
就这样,您就可以享受一杯美味的茶了。
`
const prompt =`
您将获得由三个引号括起来的文本。
如果它包含一系列的指令,则需要安装以下格式,重新编写这些指令。
第一步 - ...
第二步 - ...
...
第N步 - ...
如果文本中不包含一系列的指令,则直接写“未提供步骤”
"""${text}"""
`
const result = await getChatResponse('gpt-3.5-turbo',prompt)
console.log(result)
}
mian()
我们只用了几行准确的提示词,就让AIGC代替我们完成了任务。它可以读懂这些提示词和我们下达的任务,不得不感叹AIGC的强大。
总结
在未来,AIGC将给我们带来更高质量的内容生成,而且这些内容会更加的丰富多彩,形式多样,或许人机协作也会成为一个新时代。