定義:
又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,它定義了一種一對多的依賴關(guān)系,讓多個觀察者 對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)變化時,會通知所有的觀察者對象,使他們能夠自 動更新自己。
在觀察者模式中有如下角色:
- Subject:抽象主題(抽象被觀察者),抽象主題角色把所有觀察者對象保存在一個集合里,每 個主題都可以有任意數(shù)量的觀察者,抽象主題提供一個接口,可以增加和刪除觀察者對象。
- ConcreteSubject:具體主題(具體被觀察者),該角色將有關(guān)狀態(tài)存入具體觀察者對象,在具 體主題的內(nèi)部狀態(tài)發(fā)生改變時,給所有注冊過的觀察者發(fā)送通知。
- Observer:抽象觀察者,是觀察者的抽象類,它定義了一個更新接口,使得在得到主題更改通知 時更新自己。
- ConcrereObserver:具體觀察者,實現(xiàn)抽象觀察者定義的更新接口,以便在得到主題更改通知 時更新自身的狀態(tài)。
案例
這里案例使用一個委托進(jìn)行多播來進(jìn)行對熱水器的觀察
加熱器類
首先定義一個全局變量,溫度temperature,然后使用event聲明一個事件,委托名稱使用無返回值的Action,參數(shù)為int。然后寫一個for循環(huán)模擬燒水,溫度temperature大于95時,執(zhí)行事件。
public class HeaterSubject
{
private int _temperature;
public event Action<int> OnBoilEvent;
public void BoilWater()
{
for (int i = 0; i < 100; i++)
{
_temperature++;
if (_temperature >= 95)
{
OnBoilEvent.Invoke(_temperature);//觸發(fā)事件:發(fā)出警報,顯示水溫
}
}
}
}
監(jiān)視者
熱水器上一般都有顯示屏和警報器,這里模擬兩個觀察者,分別是顯示器和警報器
因為上面聲明的委托參數(shù)是int,這里的觀察者參數(shù)也要匹配,等一下才可以通過多播的形式插入
public class DisPlayObserver
{
/// <summary>
/// 顯示水溫
/// </summary>
/// <param name="temperature"></param>
public void Display(int temperature)
{
Console.WriteLine($"顯示屏-當(dāng)前溫度是:{temperature}");
}
}
public class AlertObserver
{
/// <summary>
/// 發(fā)出警報
/// </summary>
/// <param name="temperature"></param>
public void MakeAlert(int temperature)
{
Console.WriteLine($"語音報警器-溫度是{temperature}");
}
}
main方法
在main方法中,實現(xiàn)new一個熱水器的實例,然后使用多播將多個方法綁定到一個委托實例。當(dāng)調(diào)用此類委托時,所有綁定的方法會被一次全部調(diào)用,最后調(diào)用熱水器的燒水方法
public static void Main(string[] args)
{
HeaterSubject subject = new HeaterSubject();
//訂閱發(fā)出警報
subject.OnBoilEvent += new AlertObserver().MakeAlert;
//訂閱顯示水溫
subject.OnBoilEvent += new DisPlayObserver().Display;
subject.BoilWater();
}
文章來源:http://www.zghlxwxcb.cn/news/detail-634356.html
?多播的優(yōu)缺點
- 優(yōu)點: 降低了目標(biāo)與觀察者之間的耦合關(guān)系,兩者之間是抽象耦合關(guān)系。 被觀察者發(fā)送通知,所有注冊的觀察者都會收到信息【可以實現(xiàn)廣播機(jī)制】
- 缺點: 如果觀察者非常多的話,那么所有的觀察者收到被觀察者發(fā)送的通知會耗時 如果被觀察者有循環(huán)依賴的話,那么被觀察者發(fā)送通知會使觀察者循環(huán)調(diào)用,會導(dǎo)致系統(tǒng)崩潰
?使用場景
- 對象間存在一對多關(guān)系,一個對象的狀態(tài)發(fā)生改變會影響其他對象。
- 當(dāng)一個抽象模型有兩個方面,其中一個方面依賴于另一方面時。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-634356.html
到了這里,關(guān)于c#設(shè)計模式-行為型模式 之 觀察者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!