私が前回オブザーバーモードを勉強したとき、多くの記事は、それがsubscribe/publish(publish/subscribeモード)とも呼ばれると述べています。しかし、本「JavaScriptデザインパターン」では、2つのパターンにはまだいくつかの違いがあります。本の元の言葉は次のとおりです。
1.オブザーバーモードでは、トピック通知を受け取ることを希望するオブザーバーでは、コンテンツが変更されるイベントを購読する必要があります。
2.サブスクライブ/パブリッシュモードは、サブスクライバーとパブリッシャーの間のテーマ/イベントチャネルを使用します。イベントシステムにより、コードはアプリケーションの特定のイベントを定義できます。これにより、サブスクライバーが必要とする値を含むカスタムパラメーターを渡すことができます。目的は、加入者と出版社間の依存関係を回避することです。
オブザーバーモードとの違いは、サブスクライバーが適切なイベントハンドラーを実行して、出版社から通知を登録および受信できることです。
わかりました、私はどうやってそんなに強力になるかわかりません。これが私の理解です:
1。オブザーバーモードでは、ターゲットオブジェクトがオブザーバーの維持を担当します。パブリッシュ/サブスクライブモードでは、パブリッシャーは購読者を気にしません。彼らはメッセージを捨ててそのままにする責任があります。
2。オブザーバーモードでは、オブザーバーはインターフェイスを提供し、ターゲットオブジェクトが変更されたときにこのインターフェイスを呼び出して、独自の状態を保ち、ターゲット状態を一貫性に保つ必要があります。つまり、すべてのオブザーバーには統一されたインターフェイスが必要です(たとえば、上に記述された更新方法、すべての方法はこの名前と呼ばれる必要があります)。パブリッシュ/サブスクライブモードでは、サブスクライバーイベントのトリガーはそのようなインターフェイスに依存せず、特定のメッセージを聞くことでサブスクライバーによってトリガーされます(このメッセージには一般に、サブスクライバーが必要とする名前とパラメーターが含まれます)。サブスクライバーは出版社ではなく、メッセージプールを聴いていることが理解できます。メッセージプールで気にかけているメッセージがある限り、過去に誰がメッセージを投稿したとしても、イベントをトリガーします。出版社と購読者は分離されています。
以下は、JSでのパブリッシュ/サブスクライブモードの実装です。コピーしてコンソールに貼り付けると、試した後に理解できます。
コードコピーは次のとおりです。
var pubsub =(function(){
var q = {}
トピック= {}、
subuid = -1;
//メッセージを公開します
Q.publish = function(topic、args){
if(!topics [topic]){return;}
var Subs = Topics [Topic]、
len = subs.length;
while(len-){
subs [len] .func(topic、args);
}
これを返します。
};
//イベントを購読します
q.subscribe = function(topic、func){
トピック[トピック] =トピック[トピック]?トピック[トピック]:[];
var token =(++ subuid).toString();
トピック[トピック] .push({
トークン:トークン、
FUNC:FUNC
});
トークンを返します。
};
q;を返します。
//登録を解除して書き込みを停止し、トピックを通過してから、前のものを保存してトークンを返し、指定された要素を削除します
})();
//トリガーイベント
var logmsg = function(topics、data){
console.log( "logging:" + topics + ":" + data);
}
//指定されたメッセージ「msgname」を聞く
var sub = pubsub.subscribe( 'msgname'、logmsg);
//メッセージ「msgname」を投稿しました
pubsub.publish( 'msgname'、 'hello world');
//非上場のメッセージ「msgname1」を投稿しました
pubsub.publish( 'aonthermsgname'、 'me too!');