js-设计模式

简介: 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

单例模式

单个实例,只有一个对象,多次创建,返回同一个对象。

单例模式的核心:确保只有一个实例,并提供全局访问

发布订阅模式

观察者模式又叫发布-订阅模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态

发生改变时,所有依赖于它的对象都将得到通知。
17890-

  1. 小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售楼MM 告诉小明,不久后还有一些尾盘推出,开发商正在办理相关手续,手续办好后便可以购买。但到底是什么时候,目前还没有人能够知道。于是小明记下了售楼处的电话,以后每天都会打电话过去询问是不是已经到了购买时间。除了小明,还有小红、小强、小龙也会每天向售楼处咨询这个问题。一个星期后,售楼MM 决定辞职,因为厌倦了每天回答 1000 个相同内容的电话。当然现实中没有这么笨的销售公司,实际上故事是这样的:小明离开之前,把电话号码留在了售楼处。售楼 MM 答应他,新楼盘一推出就马上发信息通知小明。小红、小强和小龙也是一样,他们的电话号码都被记在售楼处的花名册上,新楼盘推出的时候,售楼 MM 会翻开花名册,遍历上面的电话号码,依次发送一条短信来通知他们。——这种发送短信通知就是一个典型的发布-订阅模式(观察者模式)。小明、小红等购买者都是订阅者,他们订阅了房子开售的消息。售楼处作为发布者,会在合适的时候遍历花名册上的电话号码,依次给购房者发布消息。

  2. 新冠肺炎疫情期间,小明去药店买口罩,然而到店之后却被店员告知口罩已经售罄。这时,小明给店员留了一个电话,告诉店员等口罩到货后打电话通知他一下, 这样小明就可以在口罩到货后的第一时间去药店买口罩了。小明买口罩的过程就是对发布-订阅模式的一次实践:小明将电话留给店员,让店员在口罩到货后通知他,便是一次“订阅”;店员在口罩到货后,打电话告诉小明,便是一次“发布”。不过,在上面的例子中发布-订阅模式并不是唯一的解决方案,其优势也并没有体现出来。比如,小明不想把自己的电话留给药店,而是把药店的电话记了下来,每天给药店打电话去问。从目前的情况看,这种方式也是可以工作的。但往往我们需要面临更复杂的情况:当前疫情严重,不止小明一人需要口罩,小红、小白、小黑等许许多多的人也都需要口罩,他们也都想在口罩到货的第一时间得到消息,于是他们每个人每天都需要给药店打电话询问。这样药店每天都会收到几百个电话,店员们每天都被一个简单却重复的问题搞得很疲惫,而小明也每天都担心电话打晚了会被别人先得到消息“抢”走口罩。当有许多人都想获得“口罩到货”这一相同消息时,发布-订阅模式的优势就显示出来了。只要所有想知道这个消息的用户都在药店留一个电话,当口罩到货后,店员再给“订阅”这一事件的所有用户都打电话告知一下就可以了。这样用户就不用每天都给药店打电话询问,药店也不需要每天都花大量的时间接听电话了。

    //发布者-药店
    let drugstore = {
         
        //可在订阅事件的客户列表
        clientList: {
         },
        //添加事件订阅对象的方法
        listen(eventName, fn) {
         
            if (!this.clientList[eventName]) {
         
                //如果客户订阅的事件当前不存在,则初始化这个事件
                this.clientList[eventName] = [];
            }
            //如果存在,将客户端的联系方法添加到数组中
            this.clientList[eventName].push(fn);
        },
        //向订阅对象发布消息的方法
        publish(eventName, data) {
         
            this.clientList[eventName].map(fn => {
         
                //将需要发布的数据作为参数,调用客户在订阅时传入的回调函数
                fn(data);
            })
        }
    }
    //订阅者-用户
    //口罩到货后,小明要做的事件
    function xiaoMing(data) {
         
        console.log('口罩到货了,我要赶紧去买一些!');
    }
    //小明监听口罩到货事件
    drugstore.listen('haveMask', xiaoMing);
    
    // 口罩到货后,小红要做的事情
    function xiaoHong(data) {
         
        if (new Date() > new Date('2022/8/31')) {
         
            console.log('疫情应该结束了,不买口罩了')
        } else {
         
            console.log('赶紧去买口罩,不然就买不着了')
        }
    }
    // 小红监听口罩到货事件
    drugstore.listen('haveMask', xiaoHong);
    
    // 口罩到货后,小白要做的事情
    function xiaoBai(data) {
         
        if (data.price > 100) {
         
            console.log('这口罩咋这么贵?不买了!')
        } else if (data.price > 50) {
         
            console.log('这口罩偏贵,先买10个用着,过段时间看能不能降价')
        } else {
         
            console.log('这批口罩价格还可以,买50个屯着')
        }
    }
    
    // 小白监听口罩到货事件
    drugstore.listen('haveMask', xiaoBai)
    
    // 假设到货口罩的相关信息如下
    const data = {
         
        type: 'N95',
        price: 30,
        num: 1000
    }
    
    // 发布口罩到货的消息,并把口罩的相关信息作为参数传递给订阅该事件回调函数
    // 收到信息后具体怎么处理,完全由回调函数自己定义,“药店”并不关心
    drugstore.publish('haveMask', data)
    
相关文章
|
5月前
|
设计模式 JavaScript 数据安全/隐私保护
js设计模式之工厂模式
js设计模式之工厂模式
33 0
|
4月前
|
设计模式 前端开发 算法
【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)
【面试题】 ES6 类聊 JavaScript 设计模式之行为型模式(二)
|
2月前
|
设计模式 缓存 JavaScript
js常用设计模式
js常用设计模式
22 1
|
5月前
|
设计模式 存储 JavaScript
js设计模式之单例模式
js设计模式之单例模式
47 7
|
10月前
|
设计模式 前端开发 JavaScript
|
7月前
|
设计模式 JSON 前端开发
前端面试必看(手写Promise+js设计模式+继承+函数柯里化等)JavaScript面试全通关(1/3)
前端面试必看(手写Promise+js设计模式+继承+函数柯里化等)JavaScript面试全通关(1/3)
42 0
|
10月前
|
存储 设计模式 前端开发
|
10月前
|
设计模式 JavaScript 前端开发
|
10月前
|
设计模式 JavaScript 前端开发
|
22天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
21 0