设计模式⭐

58 阅读2分钟

1.单例模式

  • 1.定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
class Singleton {
  constructor() {
    if (!Singleton.instacne) {
      Singleton.instacne = this
    }
    return Singleton.instacne
  }
}
  • 2.优点:

(1)唯一实例:单例模式确保一个类只有一个实例,避免重复创建资源。

(2)共享资源:由于只存在一个实例,所以它可以方便的共享数据,使得数据的访问和操作更为集中和一致。

2.观察者模式

  • 1.定义:观察者模式用于在对象之间建立一种一对多的依赖关系,这样当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。
class Subject {
    constructor() {
        this.obervers = []
    }
    subscribe(obs) {
        this.obervers.push(obs)
    }
    unsubscribe(obs) {
        this.obervers = this.obervers.filter(item => item !== obs)
    }
    nofity(data) {
        this.obervers.forEach(obs => {
            obs.update(data)
        })
    }
}
class Observer {
    constructor(name) {
        this.name = name
    }
    update(data) {
        console.log(`${this.name}收到的数据:${data}`);
    }
}
const sub = new Subject()

const obs1 = new Observer('obs1')
const obs2 = new Observer('obs2')
sub.subscribe(obs1)
sub.subscribe(obs2)
sub.nofity('Hello')
sub.unsubscribe(obs1)
sub.nofity('JS')

3.发布订阅模式

  • 1.定义:发布订阅模式是一种消息通信模式,用于在系统的不同部分之间传递特定的事件信息。这种模式类似于广播:一个发布者发送消息,但并不知道谁将接收它;其他订阅者可以订阅这些消息并对它们作出响应,而无需知道是哪个发布者发布了这些消息。
class PubSub {
    constructor() {
        this.subscribers = {}
    }
    // 订阅
    subscribe(topic, callback) {
        if (!this.subscribers[topic]) {
            this.subscribers[topic] = []
        }
        this.subscribers[topic].push(callback)
        return () => {
            this.unsubscribe(topic, callback)
        }
    }
    // 取消订阅
    unsubscribe(topic, callback) {
        if (this.subscribers[topic]) {
            this.subscribers[topic] = this.subscribers[topic].filter(item => item !== callback)
        }
    }
    // 发布
    publish(topic, data) {
        if (this.subscribers[topic]) {
            this.subscribers[topic].forEach(cb => {
                cb(data)
            })
        }
    }
}
const pubSub = new PubSub()
const subscribe = pubSub.subscribe('news', data => console.log(`收到的信息:${data}`))
pubSub.publish('news', 'hello')
subscribe()
pubSub.publish('news', 'hello')
  • 2.观察者模式和发布订阅模式有什么区别?

(1)观察者模式

  • 直接通信:在观察者模式中,被观察者与观察者直接通信。
  • 依赖关系:观察者与被观察者有明确的依赖关系。观察者需要明确地注册到特定的被观察者身上。

(2)发布订阅模式

  • 间接通信:在发布订阅模式中,发布者与订阅者不直接交互。发布者发布消息到一个中间层,订阅者订阅这些通道或主题,而不是订阅发布者。
  • 解耦关系:发布者和订阅者之间耦合度更低,它们不需要知道对方的存在。