この記事の目的:
- オブザーバーのデザインパターンを説明するための最も単純な言語とコードの実装
- その概念をvueで少し調べてみましょう:depとwatcherとは正確には何ですか?
私が理解しているオブザーバーパターン:
本体には配列があり、配列には通知されるオブジェクトが含まれています。通知が必要な場合は、アレイをトラバースして通知します。とても簡単です。。。。
最も単純な実装(クラシック実装)
// 主体对象:管理被通知的对象
class Subject {
constructor() {
this.arr = [];
}
add(obj) {
this.arr.push(obj)
}
noticefy() {
this.arr.forEach(element => {
element.update();
});
}
}
// 子对象,拥有一个update函数
class Observe {
constructor(name) {
this.name = name
}
update() {
console.log(`this name is :${this.name}`)
}
}
var sub = new Subject();
var obj1 = new Observe('name1')
var obj2 = new Observe('name2');
sub.add(obj1)
sub.add(obj2)
sub.noticefy();
パブリッシュサブスクライバーの実装:
それは突然私に起こりました、もっと事件があったらどうしますか?各インシデントにマークを追加しても、それは解決されません。これは、パブリッシュサブスクライバーが達成する方法です。
class Subject {
constructor() {
this.obj = {};
}
add(event, obj) {
if (!this.obj[event]) {
this.obj[event] = [];
}
this.obj[event].push(obj)
}
noticefy(event) {
this.obj[event].forEach(element => {
element.update();
});
}
}
class Observe {
constructor(name) {
this.name = name
}
update() {
console.log(`this name is :${this.name}`)
}
}
var sub = new Subject();
var obj1 = new Observe('name1')
var obj2 = new Observe('name2');
var obj3 = new Observe('name3');
sub.add("event1", obj1)
sub.add("event1", obj2)
sub.add("event2", obj3)
sub.noticefy('event1');
プッシュプル実現
すべてがオブザーバー独自の更新関数を使用しており、パラメーターを渡すことができます。渡す量が多すぎる場合はプッシュモードを意味し、渡す量が少ない場合はプルモードを意味します。。。
// 推模式,一般把整个对象传进去
noticefy(event) {
this.state = event;
this.obj[event].forEach(element => {
element.update(this);
});
}
// 拉模式,一般传一个状态
noticefy(event) {
this.obj[event].forEach(element => {
element.update(event);
});
}
総括する:
コンセプトは臭くて長いですが、しばらく落ち着くのは突然明らかになります。
オブザーバーの従来の定義
オブジェクトの1つ(サブジェクトと呼ばれる)は、それに基づくオブジェクトのリスト(オブザーバー)を維持し、状態の変化を自動的に通知します。
オブザーバーの4つの概念:
- 件名:オブザーバーのリストを維持し、オブザーバーを簡単に追加または削除できます
- オブザーバー:状態の変化をサブジェクトに通知する必要があるオブジェクトの更新インターフェースを提供します
- ConcreteSubject:状態の変化に関する通知をオブザーバーにブロードキャストし、ConcreteObserversの状態を保存します
- ConcreteObserver:ConcreteSubjectへの参照を格納し、オブザーバー更新インターフェイスを実装して、ステータスがサブジェクトと一致していることを確認します
プッシュアンドプルの概念:
これは、updateメソッドを呼び出すときにサブジェクトインスタンスにパラメーターを挿入することで実装できます。パラメータ情報の量に応じて、プッシュモデルとプルモデルの2種類に分けられます。プッシュモデルでは、サブジェクトは更新メソッドに全量の情報を注入します。プルモデルでは、サブジェクトは更新メソッドに少量の情報のみを注入し、オブザーバーインスタンスはサブジェクトインスタンスのステータスを取得します。
オブザーバーモードとパブリッシュ/サブスクライブモードの違い:
オブザーバーでは、変更があった場合、オブザーバーに直ちに通知され、オブザーバーとサブスクライバーは同時にバインドされる必要があります。
パブリッシュ/サブスクライブモデルでは、サブスクライバーは、オブザーバーがイベントにサブスクライブしたかどうかを知りません。これは、より適切なデカップリングです。
オブザーバー-vueでの使用
依存関係とは何ですか?depとは何ですか?
オブザーバーパターンの定義は次のとおりです。1対多の依存関係では、依存関係が更新されると、それに依存するオブジェクトも更新されます。したがって、depは、ターゲットオブジェクトであるdependencyの略語です。