パブリッシュ・サブスクライブ・モデルとは何ですか?手書きで書けますか?オブザーバーパターンとは違うのでしょうか? ... 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. ビジネスシナリオの紹介MySQLを使用する電子商取引システムがあるとします。大量のデータを保存...
それは何ですか? GNU Parallel は、1 台以上のコンピュータでコンピューティング タスク...
序文ブラウザをどのようにズームしても、ボックス コンテナーの高さを常に 100% に保つ必要がある場...
XAML レイアウトを使用する場合、インターフェイスを Metro 風にするために、一部のボタンでは...
このチュートリアルでは CentOS 7 64 ビットを使用します。各仮想マシンに 2GB のメモリ...
CSS3 のボックス サイズ設定 (content-box と border-box) CSS3 の...
展開環境:インストールバージョン Red Hat Cent 7.0 MYSQL バージョン 8.0....
序文最近、仮想マシンを使用して Ubuntu 18.04 をインストールしました。クローン作成後、I...
序文多くの学生は既に再帰に精通していると思います。アルゴリズムの問題を解決するために再帰がよく使...
【はじめに】: Handtrack.jsは、ブラウザ上で直接リアルタイムの手の動きの追跡と検出を実...
序文この記事では、Linux 構成ログ サーバーに関する関連コンテンツを主に紹介し、参考と学習のため...
目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...
jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...
ページめくりの問題のシナリオBとCは同じページ(表と裏)にありますページをめくって A をカバーした...
<br />「この世に醜い女性はいない、あるのは怠惰な女性だけだ」これは女性の美のバイブ...