设计模式笔记 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 观察者模式(行为型模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《红霞岛》Steam 玩家流失严重,24
- 下一篇: 阴阳师关闭定位防封吗