• 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;
    
    }
    

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

  • 相关阅读:
    【Android】 分享一个完整的项目,适合新手!
    Android笔记:Fragment与ViewPager组合时,如何在FragmentActicity获取Fragment对象
    android 获取日期
    Java: 分解List<HashMap<String, String>>
    android ExpandableListView实现不同的布局
    android: activity切换之效果
    android: activity之间切换的抽屉效果
    android 获取适配的bitmap等相关
    Eclipse改变外观,护眼模式
    安装 NoMachine(NX) client and server
  • 原文地址:https://www.cnblogs.com/lobsterIT/p/5606680.html
Copyright © 2020-2023  润新知