- はい
- それだけです。
Observer/Publisher-Subscriber パターン (または Mediator パターン) を扱うときのポイントは、「発行」を行っているクラスのタイプが実際には問題ではないということです。
A
それがエミッターであると仮定します:
var B = { doStuff : function () { console.log("Yo!"); } };
A.addListener("someEvent", B.doStuff);
A.emit("someEvent");
実際にやり取りさせたい場合は、手動で相互にサブスクライブする必要があります...
A
ANDが両方ともB
エミッターであると仮定すると、次のようになります。
B.doStuff = function () { this.emit("B's event", "Yo!"); };
A.doThing = function (param) { console.log(param); };
B.addListener("B's event", A.doThing);
A.addListener("A's event", B.doStuff.bind(B));
A.emit("A's event");
または、Mediator パターンを調べる必要があります (これも「放出」しますが、お互いを知らないが、同じイベント名を使用し、明確に定義されたデータを渡す多くのオブジェクト間を仲介する 1 つのオブジェクトであることを意図しています)。良い API のように)。
Mediator
がエミッターでありA
、 、B
およびでないと仮定すると、次のようになりC
ます。
var A = {
getData : function (request) { /* network call */ this.dataCallback(data); },
dataCallback : function (data) { Mediator.emit("data-recieved", data); }
},
B = {
display : document.getElementById("data-display"),
showData : function (data) { /* make DOM representation */ }
},
C = {
input : document.getElementById("request-input"),
button : document.getElementById("request-button"),
getRequest : function () {
var request = this.input.value;
this.requestData(request);
this.disableButton();
},
requestData : function (request) { Mediator.emit("data-request", request); },
disableButton : function () { this.button.disabled = true; },
enableButton : function () { this.button.disabled = false; }
};
Mediator.addListener("data-request", A.getData.bind(A));
Mediator.addListener("data-received", B.showData.bind(B));
Mediator.addListener("data-received", C.enableButton.bind(C));
C.button.addEventListener("click", C.getRequest.bind(C), false);
これで、お互いについて何も知らない 3 つのクラスができました。それぞれに独自の特別な目的があり、「お互い」に期待されるのは、イベント名とデータ型が適切であることだけです。
彼らは皆、について知っていMediator
ます。
Mediator をさらに抽象化する場合は、クラスを作成するときに参照を渡すことができます。
function A (param1, param2) {
var emitter = null;
this.setEmitter = function (myEmitter) { emitter = myEmitter; };
this.emit = function (evt, data) {
if (!emitter) { return; }
emitter.emit(evt, data);
};
this.subscribe = function (evt, callback) {
if (!emitter) { return; }
emitter.addListener(evt, callback);
};
/* rest of the object */
};
var a = new A();
var b = new A();
a.setEmitter(Mediator);
a.subscribe("some-evt", a.doSomething.bind(a));
b.setEmitter(Mediator);
b.subscribe("other-evt", b.doSomethingElse.bind(b));
a.emit("other-evt", { /* data */ });
a
ここでは、同じクラスである必要はまったくありb
ません。
そして今、彼らはあなたが想像している方法で機能します.
どちらも依存性注入 (「制御の反転」) を使用して同じエミッター ( Moderator
) を指しているため、同じイベント リストを知らずに操作しており、独自のメソッドを使用してModerator
s イベントをサブスクライブしています。 .