觀察者模式 (Observer pattern) 4

上一篇我們推導出需要 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;
};


留言