搜索
您的当前位置:首页正文

深度解析qt信号与槽(1)-观察者模式

来源:爱go旅游网

1.定义

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

2.深度解析

(1)角色概念

Subject: 目标, 即被观察者(基类)
ConcreteSubject: 具体目标, 即具象的被观察者(子类)
Observer: 观察者
ConcreteObserver: 具体观察者

(2)模式常混淆的概念

观察者模式的流程是:被观察者执行某个动作被观察者察觉到(其实是被观察者执行动作后通知了观察者),继而观察者执行了某个操作

往往的理解中会掺杂执行者这个概念,但其实观察者模式中根本就没有执行者,如“老师说上课,班长喊起立,同学们起立喊老师好”,这个例子中,往往就会理解不透彻,以为老师是被观察者,班长是观察者,同学们是执行者,这个就是错误的理解。
真正正确的理解是:老师和班长是一对一的观察者模式,班长和同学们是一对多的观察者模式,这个例子中包含两个观察者模式。老师是被观察者,班长是观察者;同时,班长是另一个模式里的被观察者,同学们是观察者

//观察者
class Observer
{
public:
	virtual void Update() = 0;
};
//被观察者
class Subject
{
public:
	virtual void Bind(Observer *) = 0;
	virtual void Unbound(Observer *) = 0;
	virtual void Notify() = 0;
};
//具体观察者
class ConcreteObserver : public Observer
{
public:
	ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject) {}

	void Update()
	{
		cout << "ConcreteObserver1 get the signal, to do something"<< endl;
	}

private:
	Subject *m_pSubject;
};

class ConcreteObserver2 : public Observer
{
public:
	ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject) {}

	void Update()
	{
		cout << "ConcreteObserver2 get the signal, to do something"<< endl;
	}

private:
	Subject *m_pSubject;
};
//具体被观察者
class ConcreteSubject : public Subject
{
public:
	void Bind(Observer *pObserver);
	void Unbound(Observer *pObserver);
	void Notify();

	void SomeoneOperation()
	{
		//被观察者执行某个操作,会被观察者所捕捉到,即通知了所有观察者
		Notify();
	}

private:
	std::list<Observer *> m_ObserverList;
};

void ConcreteSubject::Bind(Observer *pObserver)
{
	if (pObserver != nullptr)
	{
		m_ObserverList.push_back(pObserver);
	}
}

void ConcreteSubject::Unbound(Observer *pObserver)
{
	if (!m_ObserverList.empty())
	{
		m_ObserverList.remove(pObserver);
	}
}

void ConcreteSubject::Notify()
{
	std::list<Observer *>::iterator it = m_ObserverList.begin();
	while (it != m_ObserverList.end())
	{
		(*it)->Update();
		++it;
	}
}
int main()
{
	// Create Subject
	ConcreteSubject *pSubject = new ConcreteSubject();

	// Create Observer
	Observer *pObserver = new ConcreteObserver(pSubject);
	Observer *pObserver2 = new ConcreteObserver2(pSubject);

	// Register the observer
	pSubject->Bind(pObserver);
	pSubject->Bind(pObserver2);

	// Change the state
	pSubject->SomeoneOperation();

	delete pObserver;
	delete pSubject;
	getchar();
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top