写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; }
这应该是最简单的实现,下面进一步深化一下这种设计模式,同时复习下回调函数的使用。