zoukankan      html  css  js  c++  java
  • 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;
    
    }
    

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

  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/lobsterIT/p/5606680.html
Copyright © 2011-2022 走看看