パブリッシュ・サブスクライブ・モデルとは何ですか?手書きで書けますか?オブザーバーパターンとは違うのでしょうか? ... 1. シーン紹介次のようなシナリオを見てみましょう。 ナミはとても才能があり、多才です。現在、彼女は曲を書くこととビデオを撮影することという2つのスキルを持っています。 彼女はこれらの作品をプラットフォームに投稿する予定です。彼女をフォローしているファンはこれらのコンテンツを受け取ることができます 現在、彼にはルフィ、ゾロ、サンジの3人のファンがいる。 ナミさんが作品を発表するたびに、3人のファンのアカウントに寄せられたメッセージが更新されていきます。 では、コードで表現してみましょう。 定数ルフィ = { 更新: 関数 (曲、ビデオ) { console.log(曲、ビデオ); }, }; 定数ゾロ = { 更新: 関数 (曲、ビデオ) { console.log(曲、ビデオ); }, }; 定数サンジ = { 更新: 関数 (曲、ビデオ) { console.log(曲、ビデオ); }, }; 定数ナミ = { // このメソッドはナミの作業が更新されるたびに呼び出されます workUpdate: function () { // 作品を取得します const songs = this.getSongs(); const ビデオ = this.getVideos(); //アカウント更新 luffy.update(songs, videos); zoro.update(曲、ビデオ); sanji.update(曲、ビデオ); }, getSongs: 関数 () { "mp3"を返します。 }, getVideos: 関数 () { "mp4"を返します。 }, }; ここで問題が起こります
何か問題が見つかりましたか? ファン オブジェクトとインフルエンサー オブジェクト間の結合が高すぎるため、それぞれを独立してスケーリングすることが困難になります。 2 コードの最適化2.1 ファンを増やす問題を解決するまず最初の問題を解決して、ファンを追加するときに まず、「大きな V」を Star クラスに抽象化し、配列 クラス スター { コンストラクタ() { this.fans = []; } ファンを追加します(ファン) { this.fans.push(ファン) } 作業更新() { const songs = this.getSongs(); const ビデオ = this.getVideos(); this.fans.forEach((item) => item.update(songs, videos)); } getSongs() { "MP3"を返します。 } 動画を取得する() { "MP4"を返します。 } } 次に、「ファン」を Fan クラスに抽象化します。ファン オブジェクトを作成するときに、「big V」オブジェクトを渡し、big V の クラスファン{ コンストラクタ(名前、星) { this.name = 名前 this.star = 星 this.star.addFans(これ) } 更新(曲、ビデオ) { console.log(曲、ビデオ); } } ファンを追加するためにコードを変更する必要がなくなりました const nami = 新しい Star() const luffy = new Fan("luffy", nami); const zoro = new Fan("zoro", nami); const sanji = new Fan("sanji", nami); const robin = new Fan("robin", nami); nami.workUpdate() 2.2 作品追加の問題を解決するbig V の作業を保存するための クラス スター { コンストラクタ() { this.fans = []; これは動作します = []; } ファンを追加します(ファン) { this.fans.push(ファン); } setWorks(作業) { this.works.push(作業); // 作業を追加した後、更新メソッドを呼び出します this.workUpdate(); } getWorks() { this.works を返します。 } 作業更新() { this.fans.forEach((item) => item.update()); } } それに応じて Fan クラスを変更します。 クラスファン{ コンストラクタ(名前、星) { this.name = 名前 this.star = 星 this.star.addFans(これ) } アップデート() { console.log(`${this.name}:${this.star.getWorks()}`) } } これで、大きな V では、コードを変更して動作を追加する必要がなくなりました。 const nami = new Star(); nami.setWorks('song') nami.setWorks('ビデオ') nami.setWorks('小説') const luffy = new Fan("luffy", nami); const zoro = new Fan("zoro", nami); const sanji = new Fan("sanji", nami); nami.workUpdate(); 3 オブザーバーパターンご覧のとおり、上記の例では、 実際、これは観察者モードです
2.2 ではコードをさらに抽象化します。 「ファン」は 具体的なコードは次のとおりです。 //オブザーバー: サブジェクトクラスSubject { コンストラクタ() { this.observerList = []; // サブジェクトの状態を表します this.state = 0; } オブザーバーを追加します(オブザーバー) { this.observerList.push(オブザーバー); } // テーマの状態を変更する setState(state) { this.state = 状態; //状態が変化したら、すべてのオブザーバーに通知します this.notify(); } 状態を取得する() { this.state を返します。 } 通知() { this.observerList.forEach((オブザーバー) => observer.update()); } } //オブザーバークラスオブザーバー{ コンストラクタ(名前, 件名) { this.name = 名前; this.subject = 件名; this.subject.addObserver(これ); } アップデート() { console.log(`${this.name}:${this.subject.state}`); } } 4人のエージェントが登場大手Vはビジネスで忙しいため、アーティストとファンのつながりを維持するためのエージェントが必要です。 ブローカーの職務には以下が含まれます。
次のようにクラスに抽象化します。 クラスマネージャー{ コンストラクタ() { this.fans = []; これは動作します = []; } ファンを追加します(ファン) { this.fans.push(ファン); } setWorks(作業) { this.works.push(作業); // 作業を追加した後、更新メソッドを呼び出します this.workUpdate(); } getWorks() { this.works を返します。 } 作業更新() { this.fans.forEach((item) => item.update()); } } えっと?このコードを以前どこで見たことがありますか? はい、クラス名が変更されていることを除けば、2.2 の Star クラスとまったく同じです。 それで、これをやる意味はあるのでしょうか? 実際、コードはまったく同じです。2.2 の Star クラスでは、公開 (つまり、作品の公開) と購読 (つまり、ファンのリストの維持) に関連する関数のみを記述しており、Star クラス自体には、コンテンツの作成など、この作業以外にも多くの機能がある可能性があります。 ここで 一方、 したがって、Star と Fan のコードは次のようになります。 クラス スター { コンストラクタ() {} // 作成 create(manager) { // 作成した新しい作業をエージェントに送信します。 manager.setWorks("new work"); } } クラスファン{ コンストラクタ(名前、マネージャ) { this.name = 名前; this.manager = マネージャー; this.manager.addFans(これ); } アップデート() { console.log(`${this.name}:${this.manager.getWorks()}`); } } 5 パブリッシュ・サブスクライブモデル以前は、パブリッシュとサブスクライブを担当するブローカーを使用し、 これはパブリッシュ・サブスクライブモデルです 4 ではマネージャーをさらに抽象化します。 「ファン」を 具体的なコードは次のとおりです。 //パブリッシュおよびサブスクライブ スケジューリング センター クラス Broker { コンストラクタ() { this.subscribers = []; // サブジェクトの状態を表します this.state = 0; } // 購読購読(購読者) { this.subscribers.push(サブスクライバー); } // テーマの状態を変更する setState(state) { this.state = 状態; //状態が変化したら、公開します。this.publish(); } 状態を取得する() { this.state を返します。 } // 公開 publish() { this.subscribers.forEach((subscriber) => subscriber.update()); } } // パブリッシャークラス Publisher { コンストラクタ() {} 状態の変更(ブローカー、状態) { ブローカーの状態を設定します。 } } クラス サブスクライバー { コンストラクタ(名前、ブローカー) { this.name = 名前; this.broker = ブローカー; this.broker.subscribe(これを); } アップデート() { console.log(`${this.name}:${this.broker.getState()}`); } } 実行して効果を確認してみましょう: // ディスパッチセンターを作成する const broker = new Broker() // パブリッシャーを作成する constpublisher = new Publisher() // サブスクライバーを作成する const subscribe1 = new Subscriber('s1', broker) const subscribe2 = 新しいサブスクライバー('s2', ブローカー) const subscribe3 = 新しいサブスクライバー('s3'、ブローカー) // パブリッシャーは状態を変更し、ディスパッチ センターに通知します。ディスパッチ センターは各サブスクライバーに通知します。publisher.changeState(broker, 1) 6 オブザーバーモードとパブリッシュ・サブスクライブモードの比較役割の数に関して
結合度から
意図の観点から
JS でパブリッシュ サブスクライブ モデルを作成する方法についての記事はこれで終わりです。JS でパブリッシュ サブスクライブ モデルを作成する方法についての関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Kubernetes コントローラーとラベルの簡単な分析
v-for タグにキーが追加されていない場合。 <!DOCTYPE html> <...
メタタグ機能METAタグは、HTMLタグのHEAD領域にある重要なタグです。文書の文字セット、使用言...
リモートアクセスを有効にする次のコマンドを実行して、root ユーザーのリモート アクセス権を有効に...
1 つのサーバー上で 3 つの MySQL インスタンス プロセスが開始され、それぞれ異なるポート ...
JavaScriptでのランダムコードの生成と検証は参考までに。具体的な内容は以下のとおりです。イベ...
これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...
Docker コンテナを適用する場合、多くの場合、ホスト ディレクトリを Docker コンテナにマ...
目次序文文章パラメータ例Lodash 実装:トーキー機能: castPath関数: stringTo...
1. Windows 10 Enterprise Editionに付属する仮想マシンHyper-Vを...
html ¶ <html></html> html:xml ¶ <ht...
CenOS6.7 は MySQL8.0.22 (推奨コレクション) をインストールします1. MyS...
Excel のエクスポートは、docker 環境では常に失敗します。最も直接的な原因は、中国語フォン...
1. 同じIPアドレス、異なるポート番号仮想ホスト 1: ホスト IP アドレスは 172.16.3...
123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...
I. はじめに1: SSL証明書私のドメイン名は Tencent Cloud にあります。第 3 レ...