パブリッシュ・サブスクライブ・モデルとは何ですか?手書きで書けますか?オブザーバーパターンとは違うのでしょうか? ... 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 コントローラーとラベルの簡単な分析
1. 父から息子へ子コンポーネントにpropsフィールドを定義し、その型は配列です (フィールド値の...
【1】存在するループを使用して外部テーブルを 1 つずつクエリし、各クエリの存在する条件ステートメン...
簡単に言うと、ウェアハウスとして使用される仮想マシンの IP は 192.168.149.129 で...
みなさんこんにちは。私は梁旭です。ご存知のとおり、Linux ではデバイス ファイルも含めすべてがフ...
mysql 行から列へ、列から行へ難しい文章ではないので、詳しく説明はしません。文章を読むときは、一...
Docker イメージのダウンロードが停止したり、遅すぎたりするネットでいろいろな方法を検索しました...
1. リストリスト ulコンテナーには、一貫した構造とスタイルを持つテキストまたはグラフの形式が読...
最近、webpackの使い方を学んでいたときに、webpack-replace-loaderの設定正...
目次1. システムイメージファイルをダウンロードする2. 新しい仮想マシンを作成する3. Kali ...
MySQL で遅い SQL ステートメントを見つけるにはどうすればよいでしょうか?これは、多くの人を...
まず、404 とソフト 404 とは何でしょうか? 404: 簡単に言えば、ユーザーが存在しないペー...
IE8 や Chrome で上記の設定を使用すると、画面の最大幅に合わせて表示が統一され、各列の幅は...
1. イベントバブリング: JavaScript イベント伝播のプロセスでは、要素でイベントがトリガ...
Kubernetes は面白そうだったので(ギリシャ人なら名前に問題があると思うでしょうが)、ずっと...
目次1. 需要1. 需要2. SDKパラメータ設定1. ディレクトリ構造3. コードの実装1. バッ...