Go実装設計モード--オブザーバーモード


文書ディレクトリ
  • 定義
  • 紹介
  • コード例

  • 定義#テイギ#
    オブジェクト間に複数の関係がある場合は、オブザーバモード(Observer Pattern)を使用します.たとえば、オブジェクトが変更されると、依存オブジェクトが自動的に通知されます.観察者モードは行動型モードに属する.
    紹介する
    意図:オブジェクト間の1対多の依存関係を定義し、1つのオブジェクトの状態が変化すると、依存するすべてのオブジェクトが通知され、自動的に更新されます.
    主な解決:1つのオブジェクトの状態が他のオブジェクトに通知される問題を変更し、使いやすさと低結合を考慮し、高度な協力を保証します.
    いつ使用するか:1つのオブジェクト(ターゲットオブジェクト)の状態が変化し、すべての依存オブジェクト(オブザーバーオブジェクト)が通知され、ブロードキャスト通知されます.
    どのように解決するか:オブジェクト向けテクノロジーを使用して、この依存関係を弱めることができます.
    キーコード:抽象クラスにArrayListが存在する観察者たち.
    応用例:1、オークションの場合、オークション師は最高価格を観察し、他の競売者に通知する.2、西遊記の悟空は菩薩に紅孩児を降服させるように頼んだ.菩薩は水をこぼして老亀を招いた.この亀は観察者で、菩薩が水を撒く動作を観察した.
    利点:1、観察者と被観察者は抽象的に結合している.2、一連のトリガメカニズムを確立する.
    欠点:1、被観察者の対象に直接的かつ間接的な観察者が多い場合、すべての観察者に多くの時間がかかることを通知する.2、観察者と観察目標との間に循環依存がある場合、観察目標はそれらの間で循環呼び出しをトリガし、システムがクラッシュする可能性がある.3、観察者モードは観察者に観察した目標対象がどのように変化したのかを知らせるメカニズムがなく、観察目標が変化したことを知っているだけである.
    シーンを使用:
    1つの抽象モデルには2つの側面があり,そのうちの1つは別の側面に依存する.これらの態様は、独立したオブジェクトにカプセル化され、それぞれ独立して変更および多重化することができる.1つのオブジェクトの変更により、他の1つまたは複数のオブジェクトも変更され、特定のオブジェクトがどのくらい変更されるか分からないため、オブジェクト間の結合度を低下させることができます.オブジェクトが誰であるかを知らずに他のオブジェクトに通知する必要があります.システムにトリガチェーンを作成する必要があります.Aオブジェクトの動作はBオブジェクトに影響し、Bオブジェクトの動作はCオブジェクトに影響します.観察者モードを使用してチェーントリガメカニズムを作成できます.
    コードの例
    シーンは1セットの掲示板を作って、気象ステーションが収集したデータに基づいて、それを展示して、各ボードは異なるデータを表示して観察者のモードの核心を分析して1人の観察者がいることを示して、それから多くの観察者がいて、観察者が変化する時に観察者から観察者に知らせて、ここで変化が発生して、この例の中で、観察者は気象ステーションで、オブザーバーは掲示板コードのオブザーバーのインタフェースです
    type Subject interface {
         
    	registerObserve(Observer)//       
    	removeObserve(Observer)//       
    	notifyObserves()//     
    }
    

    オブザーバインタフェース
    type Observer interface {
         
    	update(temp, humidity, pressure float64)//    update,              update、
    }
    

    ディスプレイインタフェース
    type DisplayElement interface {
         
    	display()
    }
    

    オブザーバインスタンスでは、goloangでメソッド受信者がオブジェクトのポインタである場合、元のオブジェクトが変更され、メソッド受信者がオブジェクトの値である場合、メソッドで操作されるのは元のオブジェクトのコピーであり、元のオブジェクトに影響を与えないことに注意してください.
    type WeatherData struct {
         
    	ArrayList []Observer
    	temp      float64
    	humidity  float64
    	pressure  float64
    }
    //             ,       ,            ,                 ,       
    func (w *WeatherData) registerObserve(o Observer) {
         
    	w.ArrayList = append(w.ArrayList,o)
    }
    
    func (w *WeatherData) removeObserve(o Observer) {
         
    	for i := 0; i < len(w.ArrayList); i++ {
         
    		if w.ArrayList[i] == o {
         
    			w.ArrayList = append(w.ArrayList[:i], w.ArrayList[i+1:]...)
    		}
    	}
    }
    
    func (w *WeatherData) notifyObserves() {
         
    	for i := 0; i < len(w.ArrayList); i++ {
         
    		w.ArrayList[i].update(w.temp, w.humidity, w.pressure)
    	}
    }
    
    func (w *WeatherData) measurementsChanged() {
         
    	w.notifyObserves()
    }
    
    func (w *WeatherData) setMeasurements(temp, humidity, pressure float64) {
         
    	w.pressure = pressure
    	w.humidity = humidity
    	w.temp = temp
    	w.measurementsChanged()
    }
    
    

    オブザーバの例
    type CurrentConditionsDisplay struct {
         
    	weatherData Subject
    	ttemp        float64
    	hhumidity    float64
    }
    
    func (w *CurrentConditionsDisplay)update(temp, humidity, pressure float64) {
         
    	w.ttemp = temp
    	w.hhumidity = humidity
    	w.display()
    }
    
    func (w *CurrentConditionsDisplay) CurrentConditionsDisplay(subject Subject) {
         
    	w.weatherData = subject
    	subject.registerObserve(w)
    }
    
    func (w CurrentConditionsDisplay) display() {
         
    	fmt.Println("dispaly")
    	fmt.Println(w.ttemp)
    	fmt.Println(w.hhumidity)
    }
    
    

    テストコード
    func main() {
         
    	w:=new(WeatherData)
    	cu := new(CurrentConditionsDisplay)
    	cu.CurrentConditionsDisplay(w)
    	fmt.Println("=======")
    	w.setMeasurements(1.1, 2.2, 3.3)
    	w.setMeasurements(22, 33, 55)
    	fmt.Println("=======")
    	w.removeObserve(cu)
    	w.setMeasurements(1,2,3)
    }
    
    

    出力結果
    =======
    dispaly
    1.1
    2.2
    dispaly
    22
    33
    =======
    
    

    参考記事:https://www.runoob.com/design-pattern/observer-pattern.html Head First設計モード