Observerパターンを初めて目
1.目的と抽象オブジェクトは、オブザーバを確立する必要があります
1 // 抽象的なテーマ 2種類件名インターフェース{ 3 追加(オブザーバーO) 。4 送信(STR 文字列) 。5 } 。6 。7 // 抽象ビューア 。8種類オブザーバーインターフェース{ 9 受信(STR 文字列) 10 }
2.特定の実装のテーマ
1 // -------------気象テーマ------------------ 2型NewsSubject用の構造体{ 3 タイトル文字列 4 のL * list.List 5 } 。6 。7 // 抽象的なテーマの非侵襲的な実装に関連する天候 。8 FUNC(SUB * NewsSubject)追加(オブザーバーO){ 9 sub.l.PushBack(O) 10 } 11 12である // 非侵襲的器具抽象的なテーマに関連する気象 13は FUNC(SUB * NewsSubject)を送る(STR 文字列){ 14 のために)私は(= sub.l.Frontを:!; I =ニル; I = i.next(){ 15 (i.Value)(sub.title +(観察).Receive " 送信:" + STR) 16 } 17 } 18である 19。 // ------------- ---ホットトピック--------------- 20は HotSubject型構造体{ 21である タイトル文字列 22れる L * list.List 23である } 24の 25 // 抽象の非侵襲的な実装に関連するホットな話題 26は FUNC(SUB * HotSubject)追加(オブザーバーO){ 27 sub.l.PushBack(O) 28 } 29件の 30 // 非侵襲的な実装抽象に係るホットトピック 31FUNC(サブ* HotSubject)(STRの送信文字列){ 32 用 I:= sub.l.Front()。!I = nilを; I = i.Next(){ 33 (i.Value)(観察).Receive(sub.title +。" 发送的:" + STR) 34 } 35 }
3.オブザーバ実現
1 // -------------ビューア------------------ 2型aObserverの構造体{ 3 名文字列 4 } 。5 。6 / / 非侵襲的観察は、抽象ビューアを実装する 。7 FUNC(O * aObserver)受信(STR 文字列){ 8 fmt.Println(" クラス観察{ " + o.name + " ]受信" + STR) 。9 } 10 。11 // -------------ビューアB ------------------ 12は bObserver型構造体{ 13である 名前ストリング 14 } 15 16 // B非侵襲的観察者が抽象ビューアを実装 。17 FUNC(O * bObserver)受信(STR 文字列){ 18は fmt.Println(" クラスB [オブザーバ" +はo.name + " }受信しました" + STR) 。19 }
4.実際の呼び出し
1 FUNCメイン(){ 2 :=&aObserver { 3 名:" ジョー・スミス" 、 4 } 。5 6。 B:=&bObserver { 7。 名:" ジョン・ドウ" 、 8 } 9。 10 @ プレスおよびbを可能にサブスクリプション・タイプオブザーバ 11の。 ニュース:= NewsSubject { 12は、 L:list.New()、 13は :タイトル" 武漢ニュース" 、 14 } 15 news.Add(A) 16 news.Add(b)は 17。 18れる // ホットのみ視聴者のサブスクリプション・タイプBを可能 19。 ホット:= HotSubject { 20は、 L:list.New()、 21は、 タイトル:" 孝ホットスポット" 、 22である } 23で hot.Add(b)は 24 25 news.Send(「州の赤い嵐の警告」) 26 hot.Send(「都市のダウンタイムが閉じて」) 27 }
5.ファイル名を指定して実行結果