我正在尝试学习观察者模式,我想到的一个例子是,我想观察类的任何示例何时更新,而不仅仅是一个单例。我整理的一个例子是,我们有一个DeliverySystem
观察者,它想知道任何Burger
何时被修改。我们可以尝试用以下代码来实现这一点:
class Burger {
static observers: Observer[] = [];
static addObserver(observer: Observer) {
Burger.observers = Burger.observers.concat(observer);
}
id: number;
constructor(id: number) {
this.id = id;
}
cook() {
Burger.observers.forEach(observer => observer.update(this));
}
}
interface Observer {
update: (target: any) => void;
}
class DeliverySystem implements Observer {
update(target: any) {
console.log("DeliverySystem got pizza " + target.id);
}
observe() {
Burger.addObserver(this);
}
}
const deliverySystem = new DeliverySystem().observe();
new Burger(12345).cook();
这通常是可行的,但我不确定如何扩展它,使我的DeliverySystem
可以观察其他食物。如果我添加一个Hotdog
类,Burger
和Hotdog
可以实现什么接口,使我不必分别处理它们的观察者?我希望能够像下面这样编写Burger
,但我真的不确定如何编写:
class Burger implements Observable /* <-- what does this look like? */ {
id: number;
constructor(id: number) {
this.id = id;
}
cook() {
updateObservers(this);
}
}
2条答案
按热度按时间8e2ybdfx1#
我将为您指出Refactoring Guru。
您希望发布者(Observable)看起来像这样:
如果愿意,您甚至可以更进一步,使它们通用。
oxiaedzo2#
如果您希望能够观察所有示例,那么PublishSubscribe模式可能更合适,更具体地说,Domain Events模式更合适。
有两种主要的策略来分派事件,但最简单的是有一个PubSub单例。
通常域事件不会携带直接的聚合(例如
Burger
)引用,以便于它们的序列化和存储,并确保它们是不可变的。通常有一个Repository
模仿内存中的收集,并允许通过id检索聚合示例。