按钮的clickListener就是典型的观察者模式。
UML
点击查看【processon】
代码设计
struct ClickListener{ virtual void onClick(const Button*) = 0;}struct ButtonClickListener1 : ClickListener{ //其他listener类似。 void onClick(const Button *){ }}struct Button{ void addClickListener(const ClickListener*); void removeClickListener(const ClickListener*); void removeAllListener(); void click();private: std::vector<std::shared_ptr<ClickListener*>> m_vListeners;}Button::addClickListener(const ClickListener* listener){ if(listener){ auto it = find(m_vListeners.begin(), m_vListeners.end(), make_shared<ClickListener>(listener)) if(it == m_vListeners.end()) m_vListeners.push_back(listener); }}Button::removeClickListener(const ClickListener* listener){ if(listener){ auto it = find(m_vListeners.begin(), m_vListeners.end(), make_shared<ClickListener>(listener)); if(it != m_vListeners.end()) m_vListeners.erase(it); }}Button::removeAllListener(){ m_vListener.clear();}Button::click(){ for(auto &it : m_vListeners){ it->onClick(this); }}int main(){ Button *pBtn = new Btn; pBtn->addClickListener( new ButtonClickListener1); pBtn->addClickListener( new ButtonClickListener2); pBtn->addClickListener( new ButtonClickListener3); pBtn->onClick(); pBtn->removeAllListener(); return 0;}