ホームページ ウェブフロントエンド jsチュートリアル Javascript のオブザーバー パターンの詳細な説明 (グラフィック チュートリアル)

Javascript のオブザーバー パターンの詳細な説明 (グラフィック チュートリアル)

May 19, 2018 am 11:38 AM
javascript js

オブザーバー パターンは、パブリッシュ/サブスクライブ パターンとも呼ばれ、最も一般的に使用されるデザイン パターンの 1 つです。次の記事では主に、JavaScript のオブザーバー パターンの関連資料を詳しく紹介します。

はじめに

オブザーバー パターンは、パブリッシュ/サブスクライブ パターン (パブリッシュ/サブスクライブ) とも呼ばれ、複数のオブザーバー オブジェクトが特定のトピック オブジェクトを同時に監視できるようにします。このトピック オブジェクトのステータス 変更が発生するとすべてのオブザーバー オブジェクトに通知が送信され、オブザーバー オブジェクト自体が自動的に更新されます。正直に言うと、少し低レベルのコードを書かない限り、それを使用しないかもしれません。 しかし、これを使用すると、コードがより柔軟かつ規則的になり、冗長なコードが減り、モジュールや関数の開発が容易になります。

オブザーバー パターンを使用する利点:

  1. は、単純なブロードキャスト通信をサポートし、サブスクライブされたすべてのオブジェクトに自動的に通知します。

  2. ページが読み込まれた後、ターゲット オブジェクトはオブザーバーとの動的な関係を簡単に持つことができ、柔軟性が向上します。

  3. ターゲットオブジェクトとオブザーバーの間の抽象的な結合関係は、独立して拡張して再利用できます。

はじめに

フロントエンド ビジネスで最も一般的に使用される場所はカスタム イベントかもしれません。
実際、ブラウザのイベントもオブザーバーモードです

​​

p.onclick = function click() {
 console.log('click')
}
ログイン後にコピー

ここで、関数 click は p の click イベントをサブスクライブし、マウスがクリックされると、イベントが発行され、対応する関数が実行されます。この関数 click はオブザーバーです。

具体的な理解

実際、コードの実装を見るだけで理解できます。しかし、これらのプログラミングモデルの設計は人生経験からもたらされます。したがって、具体的な理解も非常に重要な経験です。

結婚披露宴を例に挙げてみましょう。たとえば、あなたの親友が結婚するということは、毎日起こることではなく、一生に一度か二度しか起こりません(おそらくそれ以上)。つまり、私たちが「彼の結婚式に行く」ということは絶対に起こりません。毎日、しかし特定のときだけ。絶対に毎日彼に「今日は結婚するの?宴会に来るの?」なんて聞くことはできません。 1 回か 2 回は問題ありませんが、毎日尋ねてください。あなたがパートナーを見つけられない独身男性で、あなたが毎日彼にこれを尋ねたとしても、彼はあなたを殺しません。 。

次に、ここで「通知する」イベントをリリースする必要があります。

私はオブザーバーとして、彼の「結婚」のイベントに参加しました。私たちは良い友人であり、必ず彼の結婚式に出席することに同意しました。その場合、私は観察者となり、「結婚式に行く」が対応する行動となります。 「結婚」イベントに登録すると、女の子をナンパする、ディナーデートをする、映画を見る、デートするなど、何をすべきか、毎日彼に尋ねる必要はありません。

彼が「結婚」イベントを投稿すると、通知が私に送信され、私は特定の時間に「結婚披露宴に出席する」アクション機能を実行しに行きました...

//模拟代码
//我订阅了'marry' 事件
wo.on('marry',function(){
 //去参加婚礼酒席
})
//然后他发布。比如浏览器的点击
// 对应的我的 function就会执行
ログイン後にコピー

デカップリング/モジュール/function

実際、コードでは、公開とサブスクリプションを管理するために中間サービスに似た仲介者が必要です。

たとえば、ブラウザーのイベント ハンドラーはサブスクリプション インターフェイスを提供し、「イベント」シグナルを受信して​​それを公開します。 js コードにブラウザーとの接続と対話を持たせます。しかし、元々はこの 2 つは別のものでした。

私の意見では、オブザーバー パターンの最大の利点は分離です。これにより、コードを関数とモジュールに分離できるようになり、コードがより明確になり、開発コストが削減され、保守が容易になります。

例:

1. プロジェクトのビュー表示レイヤーとモデル (データ処理) ロジックレイヤーの場合、最初にページ、Ajax、文字列スプライシングを作成し、まとめるインターフェイスをリクエストしてから、それを渡します。ドム。おそらく、js ファイルと、インターフェイスを要求し、ビューの表示を担当する関数があると思います。

var xhr = new XMLHttpRequest ()
 xhr.open('get',url)
 xhr.onreadystatechange = function () {
 if(this.readyState !== 4) return
 if(this.status === 200) {
 ps.innerHTML = &#39;<p>&#39; + this.response + &#39;</p>&#39;
 //
 }
 }
 xhr.responseType = &#39;json&#39;
 xhr.send(null)
ログイン後にコピー

実際、リクエストは表示レンダリングから分離する必要があります。

//请求
function getData () {
 var xhr = new XMLHttpRequest ()
 xhr.open(&#39;get&#39;,url)
 xhr.onreadystatechange = function () {
 if(this.readyState !== 4) return
 if(this.status === 200) {
 this.emit(&#39;渲染&#39;)
 // 发布
 }
 }
 xhr.responseType = &#39;json&#39;
 xhr.send(null)
}
//渲染
function view () {}
xhr.on(&#39;渲染&#39;,view)
ログイン後にコピー

ステータス コード 200 に直接コールバックを配置することによってもこれを行うことができます。しかし、異なる処理を行う 2 つのレンダリング関数がある場合、毎回異なる関数に変更する必要があるのでしょうか? 同じリクエスト処理を再度書かなければなりませんか?

観察者の言葉

function view1 () {}
function view2 () {}
function view3 () {}
function view4 () {}
if(我要渲染view1) {
 xhr.on(&#39;渲染&#39;,view1) //订阅
 xhr.on(&#39;渲染&#39;,view2)
}else{
 xhr.on(&#39;渲染&#39;,view3)
 xhr.on(&#39;渲染&#39;,view4)
}
ログイン後にコピー

利点は、getData 関数がデータのリクエストのみを担当し、メソッドを追加するためのインターフェイスを公開してくれることです。このように、私の getData は比較的完全な機能モジュールであり、状況がいくつであっても、getData 内のコードは変わりません。

業務を実装したり、新しい機能を追加したりするために、以前に書いたコードを変更することがあり、元の機能モジュールが認識できないほど変更されてしまうことがあります。

そして、重複したコードがたくさんあります。

プロセス?それともモジュール?

もちろん、優れた完全な機能モジュールを封印することは非常に困難ですが、少なくとも開始は必要です。

メソッドを追加するためにサブスクライブし、イベント プールの公開時にメソッドを実行します。

2. MV*クラスのフレームワーク

MVC也是一种设计模式,这里面也都应用了观察者。

他内部也都是各种发布订阅,好像是一个观察者模型,从而实现了一个模拟的内存中的dom改变,计算出那个DOM节点应该改变。当然具体实现要做好多事情…就不…

3、redux

简单实现一个createstore函数

//这是一个工厂函数,可以创建store
const createStore = (reducer) => {
 let state; // 定义存储的state
 let listeners = [];
 // getState的作用很简单就是返回当前是state
 const getState = ()=> state;
 //定义一个派发函数
 //当在外界调用此函数的时候,会修改状态
 const dispatch = (action)=>{
 //调用reducer函数修改状态,返回一新的状态并赋值给这个局部状态变量
 state = reducer(state,action);
 //依次调用监听函数,通知所有的监听函数
 listeners.forEach(listener => listener());
 }
 //订阅此状态的函数,当状态发生变化的时候记得调用此监听函数
 const subscribe = function(listener){
 //先把此监听 加到数组中
 listeners.push(listener);
 //返回一个函数,当调用它的时候将此监听函数从监听数组移除
 return function(){
  listeners = listeners.filter(l => l != listener);
 }
 }
 //默认调用一次dispatch给state赋一个初始值
 dispatch();
 return {
 getState,
 dispatch,
 subscribe
 }
}
let store = createStore(reducer);
//把数据渲染到界面上
const render = () => {
 document.body.innerText = store.getState();
}
// 订阅状态变化事件,当状态变化时用监听函数
store.subscribe(render);
render();
var INCREASE_ACTION = {type: &#39;INCREMENT&#39;};
document.addEventListener(&#39;click&#39;, function (e) {
 //触发一个Action
 store.dispatch(INCREASE_ACTION);
})
ログイン後にコピー

4、在node 中的作用 大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。

实现一个可以发布订阅的类

&#39;use strict&#39;
class EmitterEvent {
 constructor() {
 //构造器。实例上创建一个事件池
 this._event = {}
 }
 //on 订阅
 on (eventName, handler) {
 // 根据eventName,事件池有对应的事件数组,
 就push添加,没有就新建一个。
 // 严谨一点应该判断handler的类型,是不是function
 if(this._event[eventName]) {
 this._event[eventName].push(handler)
 } else {
 this._event[eventName] = [handler]
 }
 }
 emit (eventName) {
 // 根据eventName找到对应数组
 var events = this._event[eventName];
 // 取一下传进来的参数,方便给执行的函数
 var otherArgs = Array.prototype.slice.call(arguments,1)
 var that = this
 if(events) {
 events.forEach((event) => {
 event.apply(that, otherArgs)
 })
 }
 }
 // 解除订阅
 off (eventName, handler) {
 var events = this._event[eventName]
 if(events) {
 this._event[eventName] = events.filter((event) => {
 return event !== handler
 })
 }
 }
 // 订阅以后,emit 发布执行一次后自动解除订阅
 once (eventName, handler) {
 var that = this
 function func () {
 var args = Array.prototype.slice.call(arguments,0)
 handler.apply(that, args)
 this.off(eventName,func)
 }
 this.on(eventName, func)
 }
}
var event = new EmitterEvent()
function a (something) {
 console.log(something,&#39;aa-aa&#39;)
}
function b (something) {
 console.log(something)
}
 event.once(&#39;dosomething&#39;,a)
 event.emit(&#39;dosomething&#39;, &#39;chifan&#39;)
 //event.emit(&#39;dosomething&#39;)
// event.on(&#39;dosomething&#39;,a)
// event.on(&#39;dosomething&#39;,b)
// event.emit(&#39;dosomething&#39;,&#39;chifan&#39;)
// event.off(&#39;dosomething&#39;,a)
// setTimeout(() => {
// event.emit(&#39;dosomething&#39;,&#39;hejiu&#39;)
// },2000)
ログイン後にコピー

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

JS DOM元素常见增删改查操作详解

JS刷新页面方法总结

JS callback回调函数使用案例详解

以上がJavascript のオブザーバー パターンの詳細な説明 (グラフィック チュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

株価分析に必須のツール: PHP と JS を使用してローソク足チャートを描画する手順を学びます 株価分析に必須のツール: PHP と JS を使用してローソク足チャートを描画する手順を学びます Dec 17, 2023 pm 06:55 PM

株式分析に必須のツール: PHP および JS でローソク足チャートを描画する手順を学びます。特定のコード例が必要です。インターネットとテクノロジーの急速な発展に伴い、株式取引は多くの投資家にとって重要な方法の 1 つになりました。株価分析は投資家の意思決定の重要な部分であり、ローソク足チャートはテクニカル分析で広く使用されています。 PHP と JS を使用してローソク足チャートを描画する方法を学ぶと、投資家がより適切な意思決定を行うのに役立つ、より直感的な情報が得られます。ローソク足チャートとは、株価をローソク足の形で表示するテクニカルチャートです。株価を示しています

推奨: 優れた JS オープンソースの顔検出および認識プロジェクト 推奨: 優れた JS オープンソースの顔検出および認識プロジェクト Apr 03, 2024 am 11:55 AM

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする PHP および JS 開発のヒント: 株価ローソク足チャートの描画方法をマスターする Dec 18, 2023 pm 03:39 PM

インターネット金融の急速な発展に伴い、株式投資を選択する人がますます増えています。株式取引では、ローソク足チャートは一般的に使用されるテクニカル分析手法であり、株価の変化傾向を示し、投資家がより正確な意思決定を行うのに役立ちます。この記事では、PHP と JS の開発スキルを紹介し、株価ローソク足チャートの描画方法を読者に理解してもらい、具体的なコード例を示します。 1. 株のローソク足チャートを理解する 株のローソク足チャートの描き方を紹介する前に、まずローソク足チャートとは何かを理解する必要があります。ローソク足チャートは日本人が開発した

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

See all articles