• 设计模式中的原型模式(基于js实现)
  • 发布于 2个月前
  • 304 热度
    0 评论
前言

原型模式是JavaScript es6的23种设计模式中的创建型的一种设计模式。它允许创建对象的副本,同时又能高效地解决重复实例化过程中的性能问题。此模式基于一个简单的概念:复制一个已经存在的对象,调整其状态以满足新的需求,而不是通过构造函数创建新的对象。这样可以避免复杂的初始化过程,减少系统的开销。接下来我们就用泡茶的流程这一案例来探讨一下。


举例 经典传统编程
首先列出我们泡茶的步骤
1.把水煮沸
2.用沸水浸泡茶叶
3.把茶水倒进杯子
4.加柠檬

代码实现就是这样了:
首先构造一个Tea函数,构造函数和普通函数本质上没什么区别,只不过使用了new关键字创建对象的函数,被叫做了构造函数。构造函数的首字母一般是大写,用以区分普通函数,当然不大写也不会有什么错误。
function Tea(type){
    this.type=type
    console.log('您准备泡一杯'+this.type);
}
let IceRedTea=new Tea('冰红茶')
在JS中,每当创建一个新函数,该函数都会自动获得一个名为prototype的属性,这个属性是一个对象,即所谓的原型对象。它通过原型链,所有对象实例可以共享同一份原型上的属性和方法!原型链是当试图访问一个对象的某个属性或方法时,当该对象没有该属性或方法时,JS会在其原型对象中查找,以此类推形成的一条链。
function Tea(type){
    this.type=type
    console.log('您准备泡一杯'+this.type);
}
Tea.prototype.boilWater=function(){
    console.log('把水煮沸');
}
let IceRedTea=new Tea('冰红茶')
IceRedTea.boilWater()
在原型链中又有显示原型和隐式原型:显示原型用prototype属性查找原型;隐式原型用__proto__属性查找原型。
function Tea(type){
    // 堆代码 duidaima.com
    this.type=type
    console.log('您准备泡一杯'+this.type);
}
Tea.prototype.boilWater=function(){
    console.log('把水煮沸');
}
let IceRedTea=new Tea('冰红茶')
IceRedTea.boilWater()
console.log(IceRedTea.__proto__)
console.log(IceRedTea.__proto__===Tea.prototype)
通过这些代码我们可能就能大致了解原型和原型链,接下来我们就通过以上内容来完成这个泡茶的过程吧。
function Tea(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(){
    lemonTea.boilWater();
    lemonTea.steepTeaBag();
    lemonTea.pourInCup();
    lemonTea.addLemon();
}
var lemonTea=new Tea('柠檬茶')
lemonTea.init();

其中我们封装了一个init函数用来美化我们的代码。以上是使用我们经典传统编程所完成的,接下来让我们再次来使用大模型来完成这个工作吧。


AIGC
首先安装dotenv和openai两个包,保持我们代码的安全感。
然后就可以使用大模型了:
require('dotenv').config();
const OpenAI=require('openai')

const client=new OpenAI({
    apiKey:process.env.OPENAI_API_KEY,
    baseURL:'https://api.chatanywhere.tech/v1'
})
const getChatResponse = async function(model,prompt,n){
    const response = await client.chat.completions.create({
        model:model, // 适合聊天的模型   有很多种
        messages: [{
            role : 'user',
            content : prompt
        }]
    })
    return response.choices[0].message.content;
}
const main=async()=>{
    // AIGC 的优势就是处理文本,生成内容
    const text=`
    泡一杯茶很容易。首先,需要把水烧开。
    在等待期间,拿一个杯子并把茶包放进去。
    一旦水开了,就把它倒在茶包上。
    等待一会儿,让茶叶浸泡,几分钟后,取出茶包。
    如果你愿意,可以加一些糖或牛奶调味。
    就这样,您可以享受一杯美味的茶了。
    `
    const prompt=`
    您将获得有三个引号括起来的文本。
    如果它包含一系列的指令,则需要按照一下格式重新编写这些指令。
    第一步-...
    第二步-...
    ...
    第N步-...
    如果文本种不包含一系列的指令,则直接写“未提供步骤”
    """${text}"""
    `
    const response=await getChatResponse('gpt-3.5-turbo',prompt);
    console.log(response);
}
main();

与经典传统编程一样能得到我们的结果。


总结
学习设计模式是为了让我们的代码更优雅,方便后续修改,而AI的到来更提高了我们的效率;写文章也让我能巩固自己的知识,更容易记住自己所学的东西。以上个人拙见,欢迎讨论。
用户评论