C++ 之 观察者模式

写C++程序,基本上没有过什么思路,逻辑,拿过来就是一顿写,功能也实现了,但是基本上没有能够重用的代码。出现这个问题的原因,就是因为没有代码重构的概念。

正巧前天看到C++设计模式--观察者模式,之前也听过,但也就仅仅知道什么单例模式、工厂模式而已,而且还是看java的时候学习的

前段时间复习了下C++、看设计模式前,最好有一些C++的基础知识,如:类封装继承多态的概念,以及怎么使用,还有就是虚函数怎么使用的。才好理解设计模式。

设计模式会让你的程序设计上一个台阶。但是如果对C++的基础不太理解的话,还是挺困扰的

C++观察者模式:是一种一对多的设计模式,前面看的一个例子,博客这个例子来说吧,每个博主会有多个粉丝,当博文有更新的时候,粉丝会收到消息通知。这就是一个典型的观察者模式。粉丝就是观察者、博主就是信号的发出者。一个博主(对象)对应多个粉丝(对象)。

看下代码设计吧,说太多的话啰嗦

编译环境用的是 vs2015 其他的编译环境也应该能通过!

#include <string>
#include <iostream>
#include <list>
using namespace std;

class Observer
{

public:

	Observer() {}
	virtual ~Observer() {}
	virtual void Update() {}
};

class Blog
{

private:

	list<Observer *>m_observers;
protected:

	string m_status;
public:

	Blog() {}
	virtual ~Blog() {}
	void Attach(Observer *obeserver) { m_observers.push_back(obeserver); }
	void Remove(Observer *observer) { m_observers.remove(observer); }
	void SetStatus(string status) { m_status = status; }
	string GetStatus() { return m_status; }
	void notify()
	{

		list<Observer *>::iterator ite = m_observers.begin();
		while(ite != m_observers.end())
		{

			(*ite)->Update();
			ite++;
		}
	}

};

//上面是两个基类的设计,这样设计的好处是,上面的两个类知识提供基本的接口使用,并不提供代码如:Update的实现。在接口中能用virtual的就是用virtual定义,这样有助于代码的重用

//具体的博客类

class MyBlog :public Blog

{

private:

	string m_name;
public:

	MyBlog(string name) :m_name(name) {}
	~MyBlog() {}//如果构造函数使用new分配了堆栈,析构函数里面必须使用delete进行释放,不然会造成内存泄漏  //对父类的析构函数尽量定义为virtual,这样释放的时候子类和父类的析构都会调用到
	void SetStatus(string status) { m_status = "notify:" + m_name + status; }
	string GetStatus() { return m_status; }

};

//具体的观察者

class MyObserver:public Observer

{

private:

	string  m_name;
	Blog * m_blog;
public:

	MyObserver(string name, Blog* blog) :m_name(name), m_blog(blog) {}
	~MyObserver() {}
	void Update()
	{

		string status = m_blog->GetStatus();
		cout << m_name << "--------" << status << endl;
	}
};





//编写测试



int main()

{

	Blog *blog = new MyBlog("zhangsan");

	Observer *observer = new MyObserver("lisi", blog);

	blog->Attach(observer);//blog多了一个粉丝

	blog->SetStatus("我要发送通知了");

	blog->notify();

	delete blog;

	delete observer;

	return 0;

}

  这应该是最简单的实现,下面进一步深化一下这种设计模式,同时复习下回调函数的使用。

原文地址:https://www.cnblogs.com/lobsterIT/p/5606680.html