Javascriptでオブザーバーモードを実装する方法を教えます

Javascriptでオブザーバーモードを実装する方法を教えます

オブザーバーパターンとは何ですか?

  • オブザーバー パターンはデザイン パターンです。
  • オブザーバー パターンは、オブジェクト間の 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトに通知され、自動的に更新されます。
  • 簡単に言えば、オブザーバー パターンには、オブザーバーと観察対象の 2 つのモデルがあります。観察対象のオブジェクトが変化または変形すると、観察者に通知されます。

シナリオシミュレーション

  • ダブル11が来るなら、ダブル11に商品を買いたい人は観察者です。
  • あなたが購入したい製品は、観察された
  • より鮮明にするために、商品の価格を変更する販売者を追加します。販売者はパブリッシャーでもあります(公開)
  • ダブル11当日に、販売者(パブリッシャー)が商品(オブザーブド)の価格を変更し、商品を購読している人(オブザーバー)に通知が届きます。

ここに画像の説明を挿入

コードの実装

//Observer デザイン パターン //Publisher-->Merchant var shopObj = {};
//商品リスト[key:[]]、キーは商品名です shopObj.list = [];
//サブスクリプションメソッド shopObj.listen = function ( key, fn) { // keyは製品モデル、fnはサブスクリプションの動作 if (!this.list[key]) {
        this.list[キー] = [];
    }
    this.list[key].push(fn); //製品名キーを使用して製品リストにサブスクリプションを追加します}
//メッセージ公開メソッド shopObj.publish = function (key) {
    //var key = arguments[0]; //パラメータキーを渡さない場合は、次のようにすることもできます。var fns = this.list[key];
    // (var i = 0; i < fns.length; i++) の場合 {
        for(var i = 0 ,fn; fn = fns[i++];){
        // サブスクライブされた関数 fn argumentmnts を実行してすべての引数を保存します // var fn = fns[i++];
        fn.apply(これ、引数)
    }
}
// ユーザーAがサブスクリプションを追加しますshopObj.listen("Huawei", function (brand, model) {
    console.log("ユーザー A が受け取ったメッセージ: " + ブランド + モデル + "携帯電話の価格が値下げされました");
})
// ユーザー B がサブスクリプションを追加 shopObj.listen("Huawei", function (brand, model) {
    console.log("ユーザー B が受信したメッセージ: " + ブランド + モデル + "携帯電話の価格が値下げされました");
})
//c ユーザーがサブスクリプションを追加しますshopObj.listen("小米", function (brand, model) {
    console.log("ユーザー C が受信したメッセージ: " + ブランド + モデル + "携帯電話の価格が値下げされました");
})
//Double 11 加盟店が Huawei の値下げに関する情報を公開shopObj.publish("Huawei", "p30");
shopObj.publish("小米", "Mix4");

ここに画像の説明を挿入

コードのリファクタリング

//オブザーバー設計パターン var Eevent = {
    //製品リスト[キー:[]]、キーは製品名リスト:[]、
    //サブスクリプションメソッド listen: function (key, fn) { // key は製品モデル、fn はサブスクリプションの動作 if (!this.list[key]) {
            this.list[キー] = [];
        }
        this.list[キー].push(fn);
    },
    //メッセージを発行するメソッド publish: function (key) {
        //var key = arguments[0]; //パラメータキーを渡さない場合は、次のようにすることもできます。var fns = this.list[key];
        // (var i = 0; i < fns.length; i++) の場合 {
        (var i = 0, fn; fn = fns[i++];) の場合 {
            // サブスクライブされた関数 fn argumentmnts を実行してすべての引数を保存します // var fn = fns[i++];
            fn.apply(これ、引数)
        }
    }
}
//オブザーバーオブジェクトの初期化 var initEvent = function (obj) {
    (変数 i 内の Eevent) {
        obj[i] = イベント[i];
    }
}
//パブリッシャー->販売者 var shopObj = {};
イベントを初期化します。
// ユーザーAがサブスクリプションを追加しますshopObj.listen("Huawei", function (brand, model) {
    console.log("ユーザー A が受け取ったメッセージ: " + ブランド + モデル + "携帯電話の価格が値下げされました");
})
// ユーザー B がサブスクリプションを追加 shopObj.listen("Huawei", function (brand, model) {
    console.log("ユーザー B が受信したメッセージ: " + ブランド + モデル + "携帯電話の価格が値下げされました");
})
//c ユーザーがサブスクリプションを追加しますshopObj.listen("小米", function (brand, model) {
    console.log("ユーザー C が受信したメッセージ: " + ブランド + モデル + "携帯電話の価格が値下げされました");
})
//Double 11 加盟店が Huawei の値下げに関する情報を公開shopObj.publish("Huawei", "p30");
shopObj.publish("小米", "Mix4");

ここに画像の説明を挿入

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • js オブザーバーモードの紹介と使用
  • JavaScript でオブザーバー パターンを実装する方法
  • js オブザーバー モード 弾丸 スクリーン ケース
  • JavaScript デザイン パターン: オブザーバー モードとパブリッシュ サブスクライブ モードの詳細な説明
  • JavaScript デザイン パターン - オブザーバー パターンの原則と使用例
  • ネイティブ js で実装されたオブザーバー モードとサブスクライバー モードの簡単な例
  • JavaScript オブザーバー パターンの原則と使用例

<<:  SWFObjectを使用すると、HTMLにFlashを挿入する際のブラウザ互換性の問題を完全に解決できます。

>>:  ウェブデザインのための6つのヒント

推薦する

ウェブページのグリッドデザインを考える

<br />元のアドレス: http://andymao.com/andy/post/8...

MySQL ステートメントロックの実装の分析

概要: 2 つの MySQL SQL ステートメント ロックの分析次のSQL文にどのようなロックが追...

JS での Reduce Fold Unfold の使用法の詳細な説明

目次折りたたむ(減らす) for...of の使用whileループの使用折り畳み実装に近い展開する配...

MySQLでデータベースデータ保存ディレクトリを変更する方法

序文MySQL データベースのデフォルトのデータベース ファイルは /var/lib/mysql に...

WindowsにMySQL5.7圧縮パッケージを素早くインストールする

この記事では、Windows に MySQL 5.7 圧縮パッケージをインストールする方法について説...

Vueはフィルターを使用して日付をフォーマットします

この記事では、フィルターを使用して日付をフォーマットするVueの具体的なコードを参考までに紹介します...

MySQL マスター スレーブ データが矛盾しています。プロンプト: Slave_SQL_Running: 解決策はありません

この記事では、MySQL マスターとスレーブ データ間の不一致の解決方法と、プロンプト「Slave_...

Vue の双方向イベントバインディング v-model の原理についての簡単な説明

目次説明する:要約する補充するDOM を直接変更して操作する js や jQuery とは異なり、V...

この SQL 書き込み方法では本当にインデックスが失敗するのでしょうか?

序文インターネット上には、MySQL でインデックスにヒットできないさまざまな状況をまとめた記事がよ...

CSS3 の新しいレイアウト: flex の詳細な説明

Flexの基本概念フレックス レイアウト (フレックスはフレキシブル ボックスの略)、エラスティック...

Nginx の動的および静的分離実装ケースのコード分析

静的と動的の分離動的リクエストと静的リクエストはミドルウェアを通じて分離され、不要なリクエストの消費...

HTML相対パスの親ディレクトリと子ディレクトリの書き方

親ディレクトリを指定する方法../ はソース ファイルの親ディレクトリを表し、../../ はソース...

マウスを置いたときに半透明効果のテキスト説明を実現するための純粋な CSS (初心者は必読)

効果は以下のとおりです。 例1 例2:例1[結婚式の計画]を例にとるHTML: <div cl...

リンクされた画像をダウンロードしてアップロードするJavaScriptの実装

写真をアップロードするので、まずはダウンロード可能な画像リソースかどうかを判断する必要があります。正...

MySQL で重複しない携帯電話番号テーブルをバッチ生成する方法のサンプルコード

序文多くの MySQL テスト シナリオでは、テスト用に一部のテスト データを手動で生成する必要があ...