typescript 发布服务器-订阅服务器设计模式的本质

n53p2ov0  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(146)

我在网上浏览了许多文章,试图探究发布者-订阅者模式的本质,但它们经常:

  • A)包含不必要/额外的域特定组件或信息
  • B)不可靠或不符合严重的OOP标准

我在寻找这个模式的 * 最基本的 抽象的 * 解释,***而不是***行业故事问题或真实的世界的类比。我只是想知道,抽象的
为了在OOP中体现发布者-订阅者设计模式,必须存在的最小类是什么?它们的接口必须包括什么?
以清晰、最小的降价代码演示呈现。(最好使用TypeScript或严格注解的Python)
据我所知,似乎有三个主要类别

class Publisher {}
class Subscriber {}
class Broker {}

可能还有其他OOP结构,如TopicEvent等,但我不确定每个结构应该有什么方法/属性。

gxwragnw

gxwragnw1#

发布者-订阅者是一种面向网络的体系结构模式,而观察者是一种面向对象-事件的模式。它们都用于不同的软件级别。
换句话说,observer is implemented within the boundaries of an application or within a single process. Publish-Subscribe是一种跨应用程序的通信模式,消息在不同的进程之间交换。
一般来说,如果我们谈论观察者模式,我们只需要两个类:

  • 发布者或主题。您想听的内容。事件来源
  • 订阅者-或观察者。谁想听到发布者或主题生成的事件

让我举一个例子,这是Observer和Publisher(Subject)的抽象

interface IMyObserver
{
    update: (myMessage: string) => void;
}

interface IMySubject
{
    registerObserver: (o: IMyObserver) => void;

    removeObserver: (o: IMyObserver) => void;

    notifyObservers: () => void;
}

这是IMyObserver的一个具体实现:

class MyObserver implements IMyObserver
{
    _mySubject: MySubject
    _myMessage: string | undefined

    constructor(mySubject: MySubject)
    {
        this._mySubject = mySubject;
        this._mySubject.registerObserver(this);
    }

    update(myMessage: string) : void {
        this._myMessage = myMessage;
        console.log(`Observer have seen this message: ${this._myMessage}`);
    }
}

这是IMySubject的一个具体实现:

class MySubject implements IMySubject
{
    _observers: IMyObserver[] = []
    _myMessage?: string 
    _messageFromObserver?: string

    notifyObservers()
    {
        this._observers.forEach(obs => obs.update(this._myMessage ?? ''))
    }

    
    registerObserver(o: IMyObserver):void { 
      this._observers.push(o) 
    }

    removeObserver(o: IMyObserver) {
      const index = this._observers.indexOf(o);
      if(index !== -1) {
        this._observers.splice(index, 1);
      }
    }

    myMessageChanged() { 
      this.notifyObservers()
    };

    setMessage(message: string)
    {
        this._myMessage = message;
        this.myMessageChanged();
    }
}

然后你可以像这样运行上面的代码:

const mySubject = new MySubject();
const myObserver = new MyObserver(mySubject);

// message from subject
mySubject.setMessage("Hello World!");

相关问题