觀察者模式:定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴它的對象都會獲得通知並自動更新。ios
#include <iostream> #include <list> //AbstractObserver(抽象觀察者) //——爲那些在目標發生改變時需得到通知的對象定義一個更新接口。 class AbstractObserver { public: virtual void update() = 0; }; //具體觀察者 //——維護一個指向具體觀察對象的引用; //——存儲有關狀態,這些狀態應與目標的狀態保持一致; //——實現AbstractObserver的更新接口以使自身狀態與目標的狀態保持一致。 class Observer1 : public AbstractObserver { public: Observer1() { std::cout << "Observer1未被通知,狀態不變" << std::endl; } virtual void update() { std::cout << "Observer1被通知,狀態改變" << std::endl; } }; class Observer2 : public AbstractObserver { public: Observer2() { std::cout << "Observer2未被通知,狀態不變" << std::endl; } virtual void update() { std::cout << "Observer2被通知,狀態改變" << std::endl; } }; class Observer3 : public AbstractObserver { public: Observer3() { std::cout << "Observer3未被通知,狀態不變" << std::endl; } virtual void update() { std::cout << "Observer3被通知,狀態改變" << std::endl; } }; //AbstractSubject(抽象觀察目標) //——目標知道它的觀察者。能夠有任意多個觀察者觀察同一個目標; //——提供註冊和刪除觀察者對象的接口。 class AbstractSubject { public: //添加觀察者 virtual void AddObserver(AbstractObserver* observer) = 0; //刪除觀察者 virtual void DeleteObserver(AbstractObserver* observer) = 0; //通知全部觀察者 virtual void NotifyAllObserver() = 0; }; //具體觀察者 //——維護一個指向ConcreteSubject對象的引用; //——存儲有關狀態,這些狀態應與目標的狀態保持一致; //——實現Observer的更新接口以使自身狀態與目標的狀態保持一致。 class Subject : public AbstractSubject { public: //添加觀察者 virtual void AddObserver(AbstractObserver* observer) { ObserverList.push_back(observer); } //刪除觀察者 virtual void DeleteObserver(AbstractObserver* observer) { ObserverList.remove(observer); } //通知全部觀察者 virtual void NotifyAllObserver() { for (std::list<AbstractObserver*>::iterator it = ObserverList.begin(); it != ObserverList.end(); it++) { (*it)->update(); } } //具體觀察者列表 std::list<AbstractObserver*> ObserverList; }; void test() { //建立觀察者 AbstractObserver* observer1 = new Observer1; AbstractObserver* observer2 = new Observer2; AbstractObserver* observer3 = new Observer3; //建立觀察目標 AbstractSubject* subject = new Subject; //添加觀察目標 subject->AddObserver(observer1); subject->AddObserver(observer2); subject->AddObserver(observer3); std::cout << "觀察者收到通知" << std::endl; subject->NotifyAllObserver(); } int main() { test(); return 0; } //打印結果: Observer1未被通知,狀態不變 Observer2未被通知,狀態不變 Observer3未被通知,狀態不變 觀察者收到通知 Observer1被通知,狀態改變 Observer2被通知,狀態改變 Observer3被通知,狀態改變