手写发布订阅加单例模式

发布订阅

发布订阅者模式是什么?

老刘去买房,去到别墅区,他可以定很多套房子;去到平房区又可以定很多套房子(on)。交完首付后就可以安心了(emit)。如果不想买就不交钱退订(off)。售楼部有汤臣亿品,每人只能买一套房子(once)。

现在我们的任务就是帮老刘完成上面的步骤

拿上钱包

我们要帮老刘买房,那老刘拿什么买呢?当然是钱包了。 让我们帮老刘带上钱包:

js 复制代码
class Eventmitter{
    constructor() {
        this.event = {}
    }
}

先去订房

不同的房源可以买很多栋,那就好办了,老刘想买什么房就买什么房,想在哪个房源买就到哪个房源买。有钱就是任性。

js 复制代码
on(type,cb){
        if(!this.event[type]){
            this.event[type] = [cb]
        }else{
            this.event[type].push(cb)
        }
        
    }

付上首付

既然定了房那肯定帮老刘把首付搞定啊,让我们帮老刘把首付付了。

js 复制代码
    emit(type,arg){
        if(!this.event[type]){
            return
        }
        this.event[type].forEach(cb=>{
            cb(...arg)
        })
    }

退款

老刘真是的,才交完首付就想要退,没办法,谁叫老刘才是金主爸爸,那就退咯。

js 复制代码
off(type,cb){
        const index = this.event[type]
        const handles =index && index.indexOf(cb)
        if(handles !== -1){
            index.splice(handles,1)
        }
    }

买限定

原来老刘看上了一栋限定的房子,还好金主是想花更多的钱,啊呸,是想要更好的生活。

js 复制代码
once(type,cb){
        if(this.event[type] && this.event[type].indexOf(cb) !== -1){
            return
        }
        this.on(type,cb)
    }

最后参观一下老刘买的房子怎么样吧。

js 复制代码
const emiter = new Eventmitter()

function foo(){
    console.log('去买房');
}

emiter.on('sell',foo)
emiter.emit('sell')

单例模式

单例模式什么意思?你只能有一个老婆,这是法律规定的。平时你这一个女朋友,哪一个女朋友就不说你了。可是老婆只能有一个。

那单例模式可以用来干什么呢?比如弹出框、验证登陆等等。

单例模式得创建一个静态函数方法,防止其他对象发现

js 复制代码
class Person {
    constructor(name) {
      this.name = name
    }
    static getInfo(name) {
      if (!Person.instance) {
        Person.instance = new Person(name)
      }
      return Person.instance
    }
  }
  
  let p1 = Person.getInfo('李总')
  let p2 = Person.getInfo('李总')
  
  console.log(p1 == p2);

再来一个闭包的实现:

js 复制代码
function Storage() {
    this.name = '张三'
  }
  
  const Helper = (function() {
    let instance = null
    return function() {
      if (!instance) {
        instance = new Storage()
      }
      return instance
    }
  })()
  
  let p1 = new Helper()  // {name: '张三'}
  let p2 = new Helper() 
  console.log(p1 === p2); 

使用立即执行函数是为了只创建一个instance。后面再调用也不会再创建instance,保证了唯一性。

这些是不是了解起来特别简单呢。

相关推荐
Mr Xu_3 分钟前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝7 分钟前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions15 分钟前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发16 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_23 分钟前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞0524 分钟前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、29 分钟前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao29 分钟前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly35 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
愚者游世1 小时前
Delegating Constructor(委托构造函数)各版本异同
开发语言·c++·程序人生·面试·改行学it