观察者模式

来自《大话设计模式》

观察者模式定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,

会通知所有观察者对象,使他们能够自动更新自己。这里C++实现,得注意类之间的相互引用。。。。

//subjet.h
#ifndef _SUBJECT_H_
#define _SUBJECT_H_

#include <iostream>
#include <string>
#include <list>
#include "observer.h" 
 
using namespace std;


class observer;
 
class subject
{
	public:
		subject() {};
		
		virtual ~subject() {}
		
		void attach(observer *ob);
		
		void detach(observer *ob);
		
		const string &getSubState();
		
		void setSubState(const string &str);
		
		virtual void notify() = 0;
	protected:
		list<observer *> observers;
		string subState;
		 
};



 
class secretary:public subject
{
	public:
		void notify();
};

class boss:public subject
{
	public:
		void notify();
};



#endif

//subject.cpp

#include "subject.h"

/*
subject::~subject()
{
	for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
	{
		if(*iter != NULL)
		{
			delete *iter;
			*iter = NULL;
		}
	}
}
*/

void subject::attach(observer *ob)
{
	if(ob != NULL)
		observers.push_back(ob);
}


void subject::detach(observer *ob)
{
	if(ob != NULL)
	{
		for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
		{
			if(*iter == ob)
			{
				iter = observers.erase(iter);
				iter--;
			}
		}
	}
}
	
const string &subject::getSubState()
{
	return this->subState;
}
		
void subject::setSubState(const string &str)
{
	this->subState = str;
}	

void secretary::notify()
{
	cout << "secretary!" << endl;
	for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
	{
		if(*iter != NULL)
		{
			(*iter)->update();
		}
	}
}

void boss::notify()
{
	cout << "boss!" << endl;
	for(list<observer *>::iterator iter = observers.begin(); iter != observers.end(); iter++)
	{
		if(*iter != NULL)
		{
			(*iter)->update();
		}
	}
}

//observer.h

#ifndef _OBSERVER_H_
#define _OBSERVER_H_

#include <iostream>
#include <string>
#include <list>
#include "subject.h"

using namespace std;

class subject;
 
class observer
{
	public:
		observer(string na, subject *su):name(na), sub(su) {}
		virtual ~observer() {}
		virtual void update() = 0;
	protected:
		string name;
		subject *sub; 
};

class socketObserver:public observer
{
	public:
		socketObserver(string na, subject *su):observer(na, su) {}
		void update();
};

class NBAObserver:public observer
{
	public:
		NBAObserver(string na, subject *su):observer(na, su) {}
		void update();
};

#endif

//observer.cpp

#include "observer.h"


void socketObserver::update()
{
	cout << sub->getSubState() << " " << name << "关闭股票行情, 继续工作!" << endl; 
};

void NBAObserver::update()
{
	cout << sub->getSubState() << " " << name << "关闭NBA直播, 继续工作!" << endl; 
};

//main.cpp

#include <iostream>
#include <string>
#include "observer.h"


using namespace std;

int main()
{
	
	subject *laoban = new boss();
	
	socketObserver *so1 = new socketObserver("xiaoliu", laoban);
	NBAObserver *nb1 = new NBAObserver("xiaodeng", laoban);
	socketObserver *so2 = new socketObserver("xiaoming", laoban);
	NBAObserver *nb2 = new NBAObserver("xiaohong", laoban);

	laoban->setSubState(string("huhansan"));
	laoban->attach(so1);
	laoban->attach(so2);
	laoban->attach(nb1);
	laoban->attach(nb2);
	
	laoban->notify();
	
	laoban->detach(so2);
	laoban->notify();
	
	delete so1;
	so1 = NULL;
	delete so2;
	so2 = NULL;
	delete nb1;
	nb1 = NULL;
	delete nb2;
	nb2 = NULL;
	
	delete laoban;
	laoban = NULL;
	
	
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值