观察者模式--------设计模式一


先上代码,

Observers.h

#pragma once
#include <iostream>
#include <list>
#include <string>
class Subject;
class Observer
{
public:
	Observer(Subject* _sub, std::string _str, bool AutoConnect = true);
	~Observer();
	void OnUpdate();
protected:
	virtual void Connect();
	virtual void DisConnect();
private:
	Subject* sub;
	std::string obStr;
};

class Subject
{
public:
	Subject(std::string str);
	virtual void Add(Observer* ob);
	virtual void Delete(Observer* ob);
	void OnUpdate();
	std::string getName();
protected:
private:
	std::list<Observer*> obList;
	std::string strName;
};
void Observers_Test();
Observers.cpp

#include "stdafx.h"
#include "Observers.h"
void Observer::OnUpdate()
{
	std::cout<<"this is ="<<this<<"  "<<obStr<<"..."<<sub->getName()<<"\n";
}

Observer::Observer(Subject* _sub, std::string _str, bool AutoConnect /*= true*/) :sub(_sub),obStr(_str)
{
	if (AutoConnect)
	{
		Connect();
	}
}

void Observer::DisConnect()
{
	sub->Delete(this);
}

void Observer::Connect()
{
	sub->Add(this);
}

Observer::~Observer()
{

	DisConnect();

}

void Subject::OnUpdate()
{
	if (! obList.empty())
	{
		std::list<Observer*>::const_iterator itOb = obList.begin();
		for (; itOb != obList.end(); itOb++)
		{
			(*itOb)->OnUpdate();
		}
	}
}

void Subject::Delete(Observer* ob)
{
	if (ob)
	{
		obList.remove(ob);
	}
}

void Subject::Add(Observer* ob)
{
	if (ob)
	{
		obList.push_front(ob);
	}
}

Subject::Subject(std::string str) :strName(str)
{

}

std::string Subject::getName()
{
	return strName;
}
void Observers_Test()
{
	Subject* sub  = new Subject("师傅被妖怪抓走了");
	Observer* ob1 = new Observer(sub, "孙悟空");
	Observer* ob2 = new Observer(sub, "猪八戒");
	Observer* ob3 = new Observer(sub, "沙和尚");

// 	sub->Add(ob1);
// 	sub->Add(ob2);
// 	sub->Add(ob3);
	sub->OnUpdate();
	system("pause");

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值