程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> (C++ 實現設計模式) 觀察者模式

(C++ 實現設計模式) 觀察者模式

編輯:C++入門知識

(C++ 實現設計模式) 觀察者模式


觀察者模式,又稱發布--訂閱,mvc模式等. 通俗點講,比如股票來說,很多人關注一支股票,派一個人去觀察股票的情況,一有變化(觀察),就通知所有的預定這個消息的人.

而我們常見的mvc模式,v是指view-視圖,m指model-模型,有點類似觀察者模式,模型中的數據,一有變化就通知相關聯的視圖. 這樣很方便地隔離開了模型和視圖.

這裡使用的例子是關於博客的訂閱. 博客屬於被觀察的對象,訂閱者屬於觀察者. 訂閱者先訂閱(注冊)博客,博客一有更新,就會遍歷注冊表,給訂閱者推送更新的博客.

自己畫UML圖,,,我是自己畫的,UML圖對於寫程序確實很有幫助. 下面直接給出相應代碼:

observer.h:

#ifndef OBSERVER_H
#define OBSERVER_H
#include
#include "subject.h"

using namespace std;
class Blog;
class BlogCSDN;
class Observer
{
	public:
		Observer() {}
		virtual ~Observer() {}
		virtual void Update() {}
};

class ObserverBlog : public Observer
{
	private:
		string m_name; //觀察者名稱
		Blog *m_blog; //觀察的博客,以鏈表的形式更好,可以觀察多個博客
	public:
		ObserverBlog(string name, Blog *blog): m_name(name), m_blog(blog) {}
		~ObserverBlog() {}
		void Update();
};


#endif


observer.cpp

#include "observer.h"
#include

using namespace std;

void ObserverBlog::Update()
{
	string status = m_blog->GetStatus();
	cout << m_name << "-------" << status << endl;
}


subject.h

#ifndef SUBJECT_H
#define SUBJECT_H
#include
#include "observer.h"
using namespace std;
class Observer;
class Blog
{
	private:
		list m_observers; //觀察者列表
	protected:
		string m_status; //狀態
	public:
		Blog() {}
		virtual ~Blog() {}
		void Attach(Observer *observer);   //添加觀察者
		void Remove(Observer *observer);	//移除觀察者
		void Notify();	//通知觀察者
		virtual void SetStatus(string s);	//設置狀態
		virtual string GetStatus();	//獲得狀態
};

class BlogCSDN : public Blog
{
	private:
		string m_name; //博主名字
	public:
		BlogCSDN(string name) : m_name(name) {}
		~BlogCSDN() {}

		void SetStatus(string s);
		string GetStatus();

};
#endif


subject.cpp

#include "subject.h"

void Blog::Attach(Observer *observer)
{
	m_observers.push_back(observer);
}

void Blog::Remove(Observer *observer)
{
	m_observers.remove(observer);
}

void Blog::Notify()
{
	list::iterator iter = m_observers.begin();
	for(; iter != m_observers.end(); iter++) {
		(*iter)->Update();
	}
}

void Blog::SetStatus(string s)
{
	m_status = s;
}

string Blog::GetStatus()
{
	return m_status;
}



void BlogCSDN::SetStatus(string s)
{
	m_status = "csdn通知: " +m_name + s;
}

string BlogCSDN::GetStatus()
{
	return m_status;
}


main.cpp

#include "observer.h"
#include "subject.h"

int main()
{
	Blog *blog = new BlogCSDN("zy416548283");
	Observer *observer = new ObserverBlog("tutupig", blog);
	blog->Attach(observer);
	blog->SetStatus("發表觀察者模式實現的文章");
	blog->Notify();
	delete blog;
	delete observer;
	return 0;
}


編譯運行:

zy@zyPc:~/code/Cplus/designPattern/observer$ ./a.out 
tutupig-------csdn通知: zy416548283發表***文章


如果自己寫程序遇到交叉引用的問題(頭文件相互引用,又調用了類中的方法之類的),可以參考帖子:點擊打開鏈接 ,也可以看看我的提問:點擊打開鏈接

PS:

參考博客:點擊打開鏈接

參考書籍:<23種設計模式-C++> ,<易學設計模式>




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved