按钮的clickListener就是典型的观察者模式。

UML

点击查看【processon】

代码设计

  1. struct ClickListener{
  2. virtual void onClick(const Button*) = 0;
  3. }
  4. struct ButtonClickListener1 : ClickListener{ //其他listener类似。
  5. void onClick(const Button *){
  6. }
  7. }
  8. struct Button{
  9. void addClickListener(const ClickListener*);
  10. void removeClickListener(const ClickListener*);
  11. void removeAllListener();
  12. void click();
  13. private:
  14. std::vector<std::shared_ptr<ClickListener*>> m_vListeners;
  15. }
  16. Button::addClickListener(const ClickListener* listener){
  17. if(listener){
  18. auto it = find(m_vListeners.begin(), m_vListeners.end(), make_shared<ClickListener>(listener))
  19. if(it == m_vListeners.end())
  20. m_vListeners.push_back(listener);
  21. }
  22. }
  23. Button::removeClickListener(const ClickListener* listener){
  24. if(listener){
  25. auto it = find(m_vListeners.begin(), m_vListeners.end(),
  26. make_shared<ClickListener>(listener));
  27. if(it != m_vListeners.end()) m_vListeners.erase(it);
  28. }
  29. }
  30. Button::removeAllListener(){
  31. m_vListener.clear();
  32. }
  33. Button::click(){
  34. for(auto &it : m_vListeners){
  35. it->onClick(this);
  36. }
  37. }
  38. int main(){
  39. Button *pBtn = new Btn;
  40. pBtn->addClickListener( new ButtonClickListener1);
  41. pBtn->addClickListener( new ButtonClickListener2);
  42. pBtn->addClickListener( new ButtonClickListener3);
  43. pBtn->onClick();
  44. pBtn->removeAllListener();
  45. return 0;
  46. }