設計模式要干的事情就是解耦,創建型模式是將創建和使用代碼解耦,結構型模式是將不同功能代碼解耦,行為型模式是將不同的行為代碼解耦,具體到觀察者模式,它將觀察者和被觀察者代碼解耦,借助設計模式,我們利用更好的代碼結構,將一大坨代碼拆分成職責更單一的小類,讓其滿足開閉原則、高內聚低耦合等特性,以此來控制和應對代碼的復雜性,提高代碼的可擴展性,
觀察者模式的應用場景非常廣泛,小到代碼層面的解耦,大到架構層面的系統解耦,再或者一些產品的設計思路,都有這種模式的影子,比如,郵件訂閱、RSS Feeds,本質上都是觀察者模式,不同的應用場景和需求下,這個模式也有截然不同的實作方式,有同步阻塞的實作方式,也有異步非阻塞的實作方式;有行程內的實作方式,也有跨行程的實作方式,
觀察者模式的模板代碼
struct Message
{
};
struct Observer {
virtual void update(Message message) = 0;
};
struct Subject {
virtual void registerObserver(Observer* observer) = 0;
virtual void removeObserver(Observer* observer) = 0;
virtual void notifyObservers(Message message) = 0;
};
class ConcreteSubject : public Subject {
public:
void registerObserver(Observer* observer) {
observers.push_back(observer);
}
void removeObserver(Observer* observer) {
observers.remove(observer);
}
void notifyObservers(Message message) {
for (auto observer : observers) {
observer->update(message);
}
}
private:
list<Observer*> observers;
};
class ConcreteObserverOne : public Observer {
public:
void update(Message message) {
//TODO: 獲取訊息通知,執行自己的邏輯...
cout << "ConcreteObserverOne is notified." << endl;
}
};
class ConcreteObserverTwo : public Observer {
public:
void update(Message message) {
//TODO: 獲取訊息通知,執行自己的邏輯...
cout << "ConcreteObserverTwo is notified." << endl;
}
};
class Demo {
public:
static void main() {
ConcreteSubject subject = ConcreteSubject();
auto obs1 = make_shared<ConcreteObserverOne>();
auto obs2 = make_shared<ConcreteObserverTwo>();
subject.registerObserver(obs1.get());
subject.registerObserver(obs2.get());
subject.notifyObservers(Message());
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287922.html
標籤:其他
上一篇:分布式系統架構系列講解八(分布式一致性 8):PBFT演算法
下一篇:從零開始學架構(三)UML建模
