C 觀察者模式例項介紹

2022-09-26 09:45:11 字數 3990 閱讀 6110

觀察者模式

觀察者模式:定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主體物件,這個主題物件在狀態發生變化時,會通知所有觀察者。當乙個物件改變需要同時改變其他物件,而且他不知道具體有多少物件需要改變的時候,應該考慮使用觀察者模式。

觀察者結構圖:

使用場景:老闆回來通知員工需要進入工作狀態。

定義觀察者的抽象類:

複製** **如下:

abstract class observer

public abstract void update(); }

看nba直播的同事:

複製** **如下:

//使用oo

class nbaobserver : observer

public override void update()

關閉nba直播,繼續工作!",sub.subjectstate,name);

} }

//使用事件和委託

class nbaobserver2

public void closestockmarket()

關閉nba直播,繼續工作!", sub.subjectstate, name);

} }

看**的同事:

複製** **如下:

//使用oo

class stockobserver : observer

public override void update()

關閉****,繼續工作!",sub.subjectstate,name);

} }

//使用事件和委託

class stockobserver2

public void closenba()

關閉****,繼續工作!", sub.subjectstate, name);

} }

上的身份是訂閱者,下面定義發布者:

複製** **如下:

//使用oo

inte***ce isubject }

class boss : isubject

public void detach(observer observer)

public void notify() }

public string subjectstate

set

} }

//使用事件和委託

inte***ce isubject2 }

delegate void eventhandler();

class boss2 : isubject2

public string subjectstate

set

} }

主函式呼叫:

複製** **如下:

class program }

委託就是一種引用方法的型別,一旦為委託分配了方法,委託將與該方法具有完全相同的行為。委託方法的使用可以像其他任何方法一樣,具有引數和返回值。委託可以看做是對函式的抽象,是函式的乙個類,委託例項代表乙個具體的函式,而且乙個委託可以搭載多個方法,所有方法被依次喚醒。

1 觀察者模式

乙個簡單的例子,比如說貓叫,老鼠跑,主人被驚醒。

在不知道觀察者模式之前,我們的**可能是這樣的。

複製** **如下:

//老鼠類  

class mouse   

}  

//主人類  

class master   

}  

//貓類  

class cat   

}  

class program  

}  

這個**基本上能實現所有的功能。但是,這個方法特別不利用擴充套件,

試想,如果,貓叫後,狗也叫,那是不是也要在貓叫的方法裡重新加入狗叫的方法?

或者說,貓叫後,主人他老婆也醒了,是不是也要在貓叫的方法裡加入他老婆醒的方法呢?

顯然,這樣的**不利用維護,也不是物件導向的**。

觀察者模式能夠很好的解決這個問題。

觀察者模式定義物件間的一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於他的物件都得到通知並自動更新。在我們的例子中,貓和老鼠,主人,狗,主人他老婆是一對多的依賴,當貓叫時,所有依賴於它的物件都會自動執行某個操作。

觀察者模式的實現,一般有下面四部分組成。

1.isubject介面(抽象目標),含方法notify,register,unregister(名字可以自己任意取名)

2.subject類(實體目標),實現isubject介面,一般只有乙個

3.iobservable介面(抽象觀察者)。

4 observer類(實體觀察者),實現iobservable介面,一般有多個。

觀察者模式中的「註冊--通知--登出」圖示:

1. 觀察者(observer)將自己(regiester)註冊到被觀察物件(subject)中,被觀察物件將觀察者放在乙個容器(container)。container一般為ilist,arraylist等資料結構,存放多個iobservable介面變數。

2.當被觀察物件(subject)發生變化(如圖中的askpricechanged)時,容器(container)中的所有觀察者(observer)都得到通知(notify 方法),此時觀察者會自動執行某些方法。

3.當觀察者不想繼續觀察被觀察者時,可以登出(unregiester方法)

上面的例子中改造後變成:

1.isubject介面:

複製** **如下:

inte***ce isubject  

2.subject 類:

複製** **如下:

class cat : isubject  

}  

public void regiester(iobservable o)  

}  

public void unregiester(iobservable o)  

}  

public void cry()  

} 3. iobservable 介面:

複製** **如下:

inte***ce iobservable  

4.observer類(2個,mouse和master)

複製** **如下:

class mouse : iobservable  

}  

class master : iobservable  

} 5.主程式

複製** **如下:

mouse mouse = new mouse();  

master master = new master();  

cat cat = new cat();  

cat.regiester(mouse);  

cat.regiester(master);  

cat.cry();  

console.readline();

這樣就實現了觀察者模式,通過把依賴類註冊到主體類中,當主體類發生變化時,所有依賴類都得到了通知。如果需要擴充套件,比如說象上面例子的狗也叫了,我們可以定義乙個狗類,然後在主程式中把狗物件註冊到貓類中就可以了。如果不想依賴於貓類,也可以通過unregiester方法取消繫結。

同時,這也符合設計中的高內聚,低耦合的原則。

。複製** **如下:

using system;

using system.collections.generic;

using system.text;

namespace sample

}class cat

}class mouse

public void mouserun()

}class master

public void jingxing()

}}

本文標題: c# 觀察者模式例項介紹

本文位址:

C 觀察者模式

觀察者模式 有時被稱作發布 訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。作用 在大的專案中,當乙個物件的狀態發生改變時可以通知其他相關的物件,這就可以用到觀察者模式。用以將多種物件...

觀察者模式C

當物件間存在一對多的關係,當狀態改變時,其他物件都得到通知,這就是觀察者模式了。觀察者模式實現發布 訂閱功能。如我們有個專案叫ngi,需要召開stanup會議,會議上需求變更時需要通過所有參加會議的人員,我們就可以使用觀察者模式,其uml圖如下 其 實現如下 include include incl...

C 觀察者模式

下面 是使用c 實現觀察者模式的例子 觀察者 介面 public inte ce iobserver 被觀察物件 介面 public inte ce iobservable 觀察者和被觀察物件都分別從這兩個介面實現,所有的操作都是由這兩個介面定義的,而不是具體的實現。所以觀察者和被觀察物件沒有繫結在...