1.传统写法
class Son
{
public:
void DoSomeThing()
{
cout << "爸爸回来了,赶紧去写作业" << endl
}
};
class Wife
{
public:
void DoSomeThing()
{
cout << "老公回来了,去做饭" << endl;
}
};
class Me
{
public:
void Gohome()
{
wife.DoSomeThing();
son.DoSomeThing();
}
private:
Wife wife;
Son son;
};
}
int main()
{
Me me;
me.Gohome();
}
2.简单的观察者
class ObserverInterface
{
public:
virtual void DoSomeThingDoSomeThing() = 0;
virtual ~ObserverInterface() = default;
};
class Mife : public ObserverInterface
{
public:
void DoSomeThingDoSomeThing() override
{
cout << "老公回来了,该做饭了" << endl;
}
};
class Son : public ObserverInterface
{
public:
void DoSomeThingDoSomeThing() override
{
cout << "爸爸回来了,该做作业了" << endl;
}
};
class SubjectInterface
{
public:
virtual void Add(ObserverInterface* obr) = 0;
virtual void Remove(ObserverInterface* obr) = 0;
virtual void Notify() = 0;
virtual ~SubjectInterface() = default;
};
class Me :public SubjectInterface
{
public:
void Add(ObserverInterface* obr) override
{
m_observers.push_back(obr);
}
void Remove(ObserverInterface* obr) override
{
auto pos = std::find(m_observers.begin(), m_observers.end(), obr);
if (pos != m_observers.end())
{
m_observers.erase(pos);
}
}
void Notify() override
{
for (const auto& e : m_observers)
{
e->DoSomeThingDoSomeThing();
}
}
private:
std::vector<ObserverInterface*> m_observers;
};
int main()
{
Me me;
ObserverInterface* wife = new Wife;
ObserverInterface* son = new Son;
me.Add(wife);
me.Add(son);
me.Notify();
return 0;
}
3.简单的观察者(share_ptr)
class ObserverInterface
{
public:
virtual void DoSomeThingDoSomeThing() = 0;
virtual ~ObserverInterface() = default;
};
using pObserverInterface = std::shared_ptr<ObserverInterface>;
class Mife : public ObserverInterface
{
public:
void DoSomeThingDoSomeThing() override
{
cout << "老公回来了,该做饭了" << endl;
}
};
class Son : public ObserverInterface
{
public:
void DoSomeThingDoSomeThing() override
{
cout << "爸爸回来了,该做作业了" << endl;
}
};
class SubjectInterface
{
public:
virtual void Add(pObserverInterface obr) = 0;
virtual void Remove(pObserverInterface obr) = 0;
virtual void Notify() = 0;
virtual ~SubjectInterface() = default;
};
class Me :public SubjectInterface
{
public:
void Add(pObserverInterface obr) override
{
m_observers.push_back(obr);
}
void Remove(pObserverInterface obr) override
{
auto pos = std::find(m_observers.begin(), m_observers.end(), obr);
if (pos != m_observers.end())
{
m_observers.erase(pos);
}
}
void Notify() override
{
for (const auto& e : m_observers)
{
e->DoSomeThingDoSomeThing();
}
}
private:
std::vector<pObserverInterface> m_observers;
};
int main()
{
Me me;
auto wife = std::make_shared<Mife>();
auto son = std::make_shared<Son>();
me.Add(wife);
me.Add(son);
me.Notify();
return 0;
}