设计模式之观察者模式(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("下课了");
}

输出的结果

程序输出结果

设计原则

  1. 为了交互对象之间的松耦合设计而努力
    松耦合的设计之所以能够让我们建立有弹性的oo系统,能够应对变化,是因为对象之间的互相依赖性降到了最低。

  2. 多用组合少用继承

  3. 针对接口编程,不针对实现编程。

  4. 找出程序会变化的部分然后将其和固定不变的方面相分离。

发布了2 篇原创文章 · 获赞 0 · 访问量 51
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览