按钮的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;
}