設計模式筆記 19 觀察者模式(行為型)

2021-09-05 22:37:58 字數 3103 閱讀 7022

定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通 知並自動更新

在軟體構建過程中,我們需要為某些物件建立一種「通知依賴關係」 ——乙個物件(目標物件)的狀態發生改變,所有的依賴物件(觀察者物件)都將得到通知。如果這樣的依賴關係過於緊密,將使軟體不能很好地抵禦變化。使用物件導向技術,可以將這種依賴關係弱化,並形成一種穩定的依賴關係。從而實現軟體體系結構的松耦合。

看這樣乙個場景,銀行的atm機在處理完成銀行賬戶的存入或取出後會給使用者傳送手機簡訊和電子郵件,那麼就會有這樣三個物件,bankaccount emailer mobile,**如下:

public class 

bankaccount

}public class

emailer

}public class

mobile

}

上面的**中bankaccount和emailer mobile之間有很強的依賴關係,emailer和mobile的變化會對bankaccount產生很大的影響,接下來要做的就是使bankaccount不要去依賴emailer和mobile這樣的具體類,而應該去依賴他們的抽象,抽象的東西通常是穩定的,這樣bankaccount和抽象之間的依賴就是一種比較弱的依賴關係,**如下:

public class 

useraccountargs

public string phonenumber

public useraccountargs(string email, string phonenumer)

}public inte***ce

iaccountobserver

public class

emailer : iaccountobserver

}public class

mobile : iaccountobserver

}public class

bankaccount

else

useraccountargs args =

new 

useraccountargs("[email protected]","1388888****");

foreach (iaccountobserver observer in list)

}public void addobserver(iaccountobserver observer)

public void removeobserver(iaccountobserver observer)

}/// ///

客戶端呼叫

///

class

program

}

執行結果如下:

上面的改進**只是對emailer和mobile進行了抽象看,其實bankaccount也可能是不穩定的,所以也需要對bankaccount進行抽象,改進後的**如下:

public class 

useraccountargs

public string phonenumber

public useraccountargs(string email, string phonenumer)

}public inte***ce

iaccountobserver

public class

emailer : iaccountobserver

}public class

mobile : iaccountobserver

}public abstract class

subject

}public void addobserver(iaccountobserver observer)

public void removeobserver(iaccountobserver observer)

}public class

bankaccount:subject

else

useraccountargs args =

new 

useraccountargs("[email protected]","1388888****");

notify(args);

}}/// ///

客戶端呼叫

///

class

program

}

這樣就成了將不穩定的物件進行抽象,最後相互依賴的是抽象與抽象之間的依賴,便於擴充套件。

觀察者模式的結構圖:

對比上圖和上面的**有以下的對應關係

基本**的實現:

public abstract class 

subject

/// ///

移除觀察者

///

///

public void detach(observer observer)

public void notify()

}}/// ///

抽象觀察者類

///

public abstract class

observer

/// ///

具體通知者

///

public class

concretesuject : subject

public concretesuject(string subjectstate)

}/// ///

具體觀察者

///

public class

concreteobserver : observer

public override void update()

}/// ///

客戶端呼叫

///

class

program

}

返回開篇(索引)

設計模式筆記 19 觀察者模式(行為型)

定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通 知並自動更新 在軟體構建過程中,我們需要為某些物件建立一種 通知依賴關係 乙個物件 目標物件 的狀態發生改變,所有的依賴物件 觀察者物件 都將得到通知。如果這樣的依賴關係過於緊密,將使軟體不能很好地抵禦變化...

行為模式(觀察者模式)

觀察者模式,也稱發布 訂閱模式,定義了乙個被觀察者和多個觀察者的 一對多的物件關係。在被觀察者狀態發生變化的時候,它的所有觀察者都會收到通知,並自動更新。觀察者模式通常用在實時事件處理系統 元件間解耦 資料庫驅動的訊息佇列系統,同時也是mvc設計模式中的重要組成部分。以下我們以訂單建立為例。當訂單建...

行為模式 觀察者 模式

觀察者模式應用比較廣泛,又被稱為 發布 訂閱 模式。它用來定義物件間一種一對多的依賴關係,當乙個物件的狀態發生變化時,所有依賴它的物件都得到通知並被自動更新。觀察者模式的角色有 抽象主題 具體主題 發布者 抽象觀察者和具體觀察者 訂閱者 from abc import abcmeta,abstrac...