设计模式之观察者模式(c++)
什么是观察者模式呢?
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
举个栗子
观察者模式比如在报社订阅报纸时,报社是观察者,你是被观察者。如果你想订阅报纸,每天收到新的报纸,你前提先要在报社注册,注册完之后,报社根据注册的名单每天派发新的报纸,如果你不想订阅报纸了,你可以向报社取消订阅,然后报社会在名单把你移除,这样你就收不到报纸了。
还有个栗子,就是微信的公众号就是一种观察者模式,如果你关注了某一个公众号,当公众号推送新的消息时候,你就会收到,如果你点击取消关注了,当公众号再次发送消息时,此时的你无法得到公众号的最新消息了。
贴段微信公众号的代码,新手可能写的也不是很好,哈哈哈。
#include "pch.h"
#include <iostream>
#include <string>
#include <list>
class Observer;
class Subject
{
public:
virtual ~Subject() {};
virtual void registerObsvr(Observer* obsvr) = 0;
virtual void removeObsvr(Observer* obsvr) = 0;
virtual void notifyObsvr(const std::string &msg) = 0;
};
class Observer
{
public:
virtual ~Observer() {};
virtual void Update(const std::string &msg) = 0;
virtual std::string getName() = 0;
protected:
Observer() {};
};
class Wechat : public Subject
{
public:
void registerObsvr(Observer* obsvr);
void removeObsvr(Observer* obsvr);
void notifyObsvr(const std::string &msg);
private:
std::list<Observer* >obsvr_list;
};
void Wechat::registerObsvr(Observer* obsvr)
{
obsvr_list.push_back(obsvr);
}
void Wechat::removeObsvr(Observer* obsvr)
{
if(obsvr_list.size() > 0)
{
obsvr_list.remove(obsvr);
}
}
void Wechat::notifyObsvr(const std::string& msg)
{
for (auto i : obsvr_list)
{
i->Update(msg);
}
}
class StudentA : public Observer
{
public:
StudentA() {};
void Update(const std::string& msg);
std::string getName();
};
void StudentA::Update(const std::string & msg)
{
std::cout << "studentA" << msg<<std::endl;
}
std::string StudentA::getName()
{
std::string name = "studentA";
return name;
}
class StudentB : public Observer
{
public:
StudentB() {};
void Update(const std::string& msg);
std::string getName();
};
void StudentB::Update(const std::string & msg)
{
std::cout << "studentB" << msg << std::endl;
}
std::string StudentB::getName()
{
std::string name = "studentB";
return name;
}
class StudentC : public Observer
{
public:
StudentC() {};
void Update(const std::string& msg);
std::string getName();
};
void StudentC::Update(const std::string & msg)
{
std::cout << "studentC" << msg << std::endl;
}
std::string StudentC::getName()
{
std::string name = "studentC";
return name;
}
int main()
{
Wechat *wechat = new Wechat();
Observer* aaa = new StudentA();
Observer* bbb = new StudentB();
Observer* ccc = new StudentC();
wechat->registerObsvr(aaa);
wechat->registerObsvr(bbb);
wechat->registerObsvr(ccc);
wechat->notifyObsvr("上课了");
wechat->removeObsvr(bbb);
wechat->notifyObsvr("下课了");
}
输出的结果
设计原则
-
为了交互对象之间的松耦合设计而努力
松耦合的设计之所以能够让我们建立有弹性的oo系统,能够应对变化,是因为对象之间的互相依赖性降到了最低。 -
多用组合少用继承
-
针对接口编程,不针对实现编程。
-
找出程序会变化的部分然后将其和固定不变的方面相分离。