c++ 观察者模式模板类

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
使用c++11可变参数模板,实现通知函数参数可变。

#include <mutex>
#include <list>
#include <algorithm>

template <class TObserver>
class CSubject
{
public:
	CSubject() {};
	virtual ~CSubject() {};

	bool Attach(TObserver* obj);
	bool Detach(TObserver* obj);

public:
	template <class FunctionPointer, class... Args>
	void NotifyObservers(FunctionPointer fun, Args&&... args);

private:
	std::list<TObserver*> list_observers;
	std::mutex mutex;
};

template <class TObserver>
bool CSubject<TObserver>::Attach(TObserver* obj)
{
	if (nullptr == obj)
	{
		return false;
	}
	std::unique_lock<std::mutex> locker(mutex);
	auto it = std::find(list_observers.begin(), list_observers.end(), obj);
	if (it == list_observers.end())
	{
		list_observers.push_back(obj);
	}

	return true;
}

template <class TObserver>
bool CSubject<TObserver>::Detach(TObserver* obj)
{
	std::unique_lock<std::mutex> locker(mutex);
	auto it = std::find(list_observers.begin(), list_observers.end(), obj);
	if (it != list_observers.end())
	{
		list_observers.erase(it);
	}

	return true;
}

template <class TObserver>
template <class FunctionPointer, class... Args>
void CSubject<TObserver>::NotifyObservers(FunctionPointer fun, Args&&... args)
{
	std::unique_lock<std::mutex> locker(mutex);
	for (auto it : list_observers)
	{
		(it->*fun)(std::forward<Args>(args)...);
	}
}
posted @ 2021-10-22 16:44  川野散人  阅读(55)  评论(0)    收藏  举报