日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式笔记 18. Observer 观察者模式(行为型模式)

發布時間:2023/12/19 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式笔记 18. Observer 观察者模式(行为型模式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??

18. Observer 觀察者模式???????????????????? 2008-09-15

動機(Motivation)

在軟件構建過程中,我們需要為某些對象建立一種“通知依賴關系”——一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知。如果這樣的依賴關系過于緊密,將使軟件不能很好地抵御變化。

使用面向對象技術,可以將這種依賴關系弱化,并形成一種穩定的依賴關系。從而實現軟件體系結構的松耦合。

意圖(Intent

定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并自動更新。????????——《設計模式》GoF

?

示意代碼:

????//Subject類,它把所有對觀察者對象的引用保存在一個聚焦里,每個主題都可以
????
//有任何數量的觀察者,抽象主題提供一個接口,可以增加和刪除觀察者對象
????abstract?class?Subject
????
{
????????
private?IList<Observer>?observers?=?new?List<Observer>();

????????
//增加觀察者
????????public?void?Attach(Observer?observer)
????????
{
????????????observers.Add(observer);
????????}


????????
//移除觀察者
????????public?void?Detach(Observer?observer)
????????
{
????????????observers.Remove(observer);
????????}

????????
//通知
????????public?void?Notify()
????????
{
????????????
foreach?(Observer?o?in?observers)
????????????????o.Update();
????????}

????}

?

????//ConcereteSubject類,具體主題,將有關狀態存入具體觀察者對象:
????
//在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知
????class?ConcreteSubject?:?Subject
????
{
????????
private?string?subjectState;

????????
//具體通知者狀態
????????public?string?SubjectState
????????
{
????????????
get?{?return?subjectState;?}
????????????
set?{?subjectState?=?value;?}
????????}

????}

?

????//Observer類,抽象觀察者,為所有的具體觀察定義一個接口,在得到主題的通知時更新自己
????abstract?class?Observer
????
{
????????
public?abstract?void?Update();
????}

?

????//ConcreteObserver類,具體觀察者,實現抽象觀察者角色所要求的更新接口,
????
//以便使本身的狀態與主題的狀態相協調
????class?ConcreteObserver?:?Observer
????
{
????????
private?string?name;
????????
private?string?observerState;
????????
private?ConcreteSubject?subject;

????????
public?ConcreteObserver(ConcreteSubject?subject,?string?name)
????????
{
????????????
this.subject?=?subject;
????????????
this.name?=?name;
????????}


????????
//更新
????????public?override?void?Update()
????????
{
????????????observerState?
=?subject.SubjectState;
????????????Console.WriteLine(
"觀察者{0}的新狀態是{1}",
??????????????name,?observerState);
????????}


????????
public?ConcreteSubject?Subject
????????
{
????????????
get?{?return?subject;?}
????????????
set?{?subject?=?value;?}
????????}

????}

?

客戶端代碼:

????class?Program
????
{
????????
static?void?Main(string[]?args)
????????
{
????????????ConcreteSubject?s?
=?new?ConcreteSubject();

????????????s.Attach(
new?ConcreteObserver(s,?"X"));
????????????s.Attach(
new?ConcreteObserver(s,?"Y"));?
????????????s.Attach(
new?ConcreteObserver(s,?"Z"));

????????????s.SubjectState?
=?"ABC";
????????????s.Notify();

????????????Console.Read();
????????}

????}

?

Observer 的幾個要點

使用面向對象的抽象,Observer模式使得我們可以獨立地改變目標與觀察者,從而使二者之間的依賴關系達致松耦合。

目標發送通知時,無需指定觀察者,通知(可以攜帶通知信息作為參數)會自動傳播。觀察者自己決定是否需要訂閱通知,目標對象對此一無所知。

C#event中,委托充當了抽象的Observer接口,而提供事件的對象充當了目標對象。委托是比抽象Observer接口更為松耦合的設計。

適用性

1.當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。

2.當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。

3.當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。

?

轉載于:https://www.cnblogs.com/MaoBisheng/archive/2008/09/15/1291130.html

總結

以上是生活随笔為你收集整理的设计模式笔记 18. Observer 观察者模式(行为型模式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。