在上一篇我們推導出需要 Subject 抽象基礎類別的原因,但讀者有沒有發現,不同股票主題類別其實是一樣的,只是值不一樣,所以 API 才可以如此設計,那如果關注的是不同類型的主題該怎麼辦?例如技術分析頁同時接收股價資料與響應 UI 的操作,讓我們先從一個觀察者對多個不同的主題開始。
Stock 的觀察者模式
class IStockSubject
{
public:
virtual void Subscribe(const std::shared_ptr<IStockObserver>& ob) = 0;
virtual void Unsubscribe(const std::shared_ptr<IStockObserver>& ob) = 0;
virtual void Notify() = 0;
public:
virtual std::string GetStockID() const = 0;
virtual double GetPrice() const = 0;
};
class IStockObserver
{
public:
virtual ~IStockObserver() = 0
{}
public:
virtual void Update(IStockSubject* pSubject) = 0;
};
UI 的觀察者模式
class IUISubject
{
public:
virtual ~IUISubject() = 0
{}
public:
virtual void Subscribe(const std::shared_ptr<IUIObserver>& ob) = 0;
virtual void Unsubscribe(const std::shared_ptr<IUIObserver>& ob) = 0;
virtual void Notify() = 0;
public:
virtual int GetButtonState() const = 0;
};
class IUIObserver
{
public:
virtual ~IUIObserver() = 0
{}
public:
virtual void Update(IUISubject* pSubject) = 0;
};
留言
張貼留言