觀察者模式
觀察者模式:定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主體物件,這個主題物件在狀態發生變化時,會通知所有觀察者。當乙個物件改變需要同時改變其他物件,而且他不知道具體有多少物件需要改變的時候,應該考慮使用觀察者模式。
觀察者結構圖:
使用場景:老闆回來通知員工需要進入工作狀態。
定義觀察者的抽象類:
複製** **如下:
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 觀察者和被觀察物件都分別從這兩個介面實現,所有的操作都是由這兩個介面定義的,而不是具體的實現。所以觀察者和被觀察物件沒有繫結在...