《四》设计模式 观察者模式 Observer / event

1.动机
在软件构建的过程中,我们需要为某些对象建立一种"通知依赖关系"------------一个对象的状态发送改变,所有依赖对象都将得到通知。如果者样的依赖关系过于精密,将使软件不能很好地抵御变化。

Observer.hpp

//入口类
class MainForm : public Form,public IPorgress
{
	TextBox *txtFilePath;
	TextBox *txtFileNumber;
	ProgressBar *progressBar;
public:
	void button_Click()
	{
		string filePath = txtFilePath->getText();
		int number = atoi(txtFileNumber->getText());
		FileSplitter splitter(filePath,number);
		ConsoleNotifier cn;
		splitter.dd_IPorgressList(this);	//添加观察者
		splitter.dd_IPorgressList(&cn);		//添加观察者
		
		splitter.split();
		splitter.remove_PorgressList(&cn);	//删除观察者
	}
	virtual void DoProgress(float value)	
	{
		progressBar->setValue(value);
	}
};

//观察者
class ConsoleNotifier :public IPorgress
{
	virtual void DoProgress(float value)
	{
		progressBar->setValue(value);
	}
}

//抽象的通知基类
class IPorgress
{
public: 
	virtual void DoProgress(float value) = 0;
	virtual ~IPorgress();
};

//稳定类 当需要添加观察者时,这个类不用改变
class FileSplitter
{
	string m_filePath;
	int m_number;
	List<IPorgress*> m_IPorgressList;	//抽象的通知机制 通知多个观察者

public:
	FileSplitter(string filePath,int number):
	m_filePath(filePath),
	m_number(number)
	{}
	

	void sqlit()
	{
		//·····
		for(int i=0;i<number;i++)
		{
			
			onPorgress(number/i);
		}
	}
	
	void add_IPorgressList(IPorgress* iporgress)	//添加观察者接口
	{
		m_IPorgressList.add(iporgress);
	}
	
	void remove_PorgressList(IPorgress* iporgress) //删除观察者接口
	{
		m_IPorgressList.remove(iporgress);
	}
	
protected:
	virtual void onPorgress(float value)		//通知观察者
	{
		for(auto it = m_IPorgressList.begin();it !=m_IPorgressList.end(),it++)
		{
			it->DoProgress(value);//通知每一个观察者
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值