目錄
1、觀察者模式(Observer Pattern)含義
2、觀察者模式的UML圖學(xué)習(xí)
3、觀察者模式的應(yīng)用場景
4、觀察者模式的優(yōu)缺點
(1)優(yōu)點:
(2)缺點
5、C++實現(xiàn)觀察者模式的實例
1、觀察者模式(Observer Pattern)含義
觀察者模式(Observer)定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同事監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己?!綝P】
觀察者模式(Observer Pattern)是一種行為型設(shè)計模式,它定義了對象之間的一對多依賴關(guān)系,使得當(dāng)一個對象狀態(tài)發(fā)生改變時,所有依賴它的對象都會自動收到通知并更新。
2、觀察者模式的UML圖學(xué)習(xí)
觀察者模式的主要角色包括:
(1)Subject(目標):被觀察的對象,它維護了一個觀察者列表,并提供了添加、刪除和通知觀察者的方法。
(2)Observer(觀察者):觀察目標的對象,它定義了接收通知并進行相應(yīng)操作的方法。
(3)ConcreteSubject(具體目標):具體的被觀察對象,繼承或?qū)崿F(xiàn)了Subject接口,可以有多個不同的具體目標。
(4)ConcreteObserver(具體觀察者):具體的觀察者對象,繼承或?qū)崿F(xiàn)了Observer接口,可以有多個不同的具體觀察者。
3、觀察者模式的應(yīng)用場景
(1)當(dāng)一個對象的改變需要同時通知其他對象,并且不知道具體有多少個對象需要通知時。
(2)當(dāng)一個抽象模型有兩個方面,其中一個方面依賴于另一個方面,將這兩個方面封裝在獨立的對象中,使它們可以獨立地改變和復(fù)用時。
4、觀察者模式的優(yōu)缺點
(1)優(yōu)點:
? ? ? ? 1)解耦性:觀察者模式將目標和觀察者解耦,使得它們可以獨立地變化。
? ? ? ? 2)擴展性:可以很方便地增加新的觀察者和目標,符合開閉原則。
? ? ? ? 3)可以實現(xiàn)一對多的依賴關(guān)系,一個目標可以有多個觀察者。
(2)缺點
? ? ? 1)觀察者過多時,會導(dǎo)致通知時間增加,影響性能。
? ? ? ? 2)觀察者和目標之間有循環(huán)依賴時,可能會導(dǎo)致循環(huán)調(diào)用,需要注意避免。文章來源:http://www.zghlxwxcb.cn/news/detail-696431.html
5、C++實現(xiàn)觀察者模式的實例
#include <iostream>
#include <vector>
// 觀察者接口
class Observer
{
public:
virtual void update(int data) = 0;
};
// 具體觀察者A
class ConcreteObserverA : public Observer
{
public:
void update(int data) override
{
std::cout << "ConcreteObserverA received update: " << data << std::endl;
}
};
// 具體觀察者B
class ConcreteObserverB : public Observer
{
public:
void update(int data) override
{
std::cout << "ConcreteObserverB received update: " << data << std::endl;
}
};
// 目標類
class Subject
{
private:
int data;
std::vector<Observer*> observers;
public:
void attach(Observer* observer)
{
observers.push_back(observer);
}
void detach(Observer* observer)
{
for (auto it = observers.begin(); it != observers.end(); ++it)
{
if (*it == observer)
{
observers.erase(it);
break;
}
}
}
void notify()
{
for (auto observer : observers)
{
observer->update(data);
}
}
void setData(int newData)
{
data = newData;
notify();
}
};
int main()
{
Subject subject;
ConcreteObserverA observerA;
ConcreteObserverB observerB;
subject.attach(&observerA);
subject.attach(&observerB);
subject.setData(10);
subject.detach(&observerA);
subject.setData(20);
return 0;
}
在上述示例中,我們定義了Observer接口和兩個具體觀察者類ConcreteObserverA和ConcreteObserverB。Subject類作為目標類,維護了一個觀察者列表,并提供了attach、detach和notify等方法。在主函數(shù)中,我們創(chuàng)建了一個Subject對象和兩個具體觀察者對象,并通過attach方法將它們注冊到Subject中。然后,通過setData方法改變Subject的數(shù)據(jù),從而觸發(fā)通知并更新觀察者。文章來源地址http://www.zghlxwxcb.cn/news/detail-696431.html
到了這里,關(guān)于(三)行為模式:7、觀察者模式(Observer Pattern)(C++示例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!