将模板变量从主题传递给观察者 - 观察设计模式



我在这个简单的用例中使用观察器设计模式,其中Subject具体类的更改,模板值_x通过notify()传递给观察者,但这需要Subject成为我不想要的模板类。

我没有将Subject创建为模板类,而是notify模板函数并Observer模板,以允许在update()中传递模板value,但这会导致Subject内部出现问题,而不需要是模板类。

在不制作模板的情况下解决这个问题的任何想法Subject

class Subject;
template<typename T>
class Observer
{
public:
virtual void update(T value, Subject *) = 0;
};
class Subject
{
std::vector<Observer<T>*> _obs;
public:
void attach(Observer<T>* obs)
{
_obs.push_back(obs);
}
template<typename T>
void notify(T value)
{
for (auto& o: _obs)
{
o->update(value, this);
}
}
};
template<typename T>
class B : public Observer<T>
{
public:
void update(T value, Subject* sub)
{
std::cout << "Value set = " << value << std::endl;
}
};
template<typename T>
class A : public Subject
{
T _x;
public:
void set(T value)
{
_x = value;
notify(_x); // want to pass T without making Subject template
}
};
int main() 
{
A<int> a1;
B <int> b1;
a1.attach(&b1);
a1.set(10);
}

如果你真的承诺对于notify<T>,只有Observer<T>,那么你就可以安全地使用dynamic_cast:

class Subject;
class ObsBase{
virtual ~ObsBase()=default;
};
template<typename T>
class Observer:public ObsBase
{
public:
virtual void update(T value, Subject *) = 0;
};
class Subject
{
//If this is the owner, use std::unique_ptr<ObsBase>
std::vector<ObsBase*> _obs;
public:
void attach(ObsBase* obs)
{
_obs.push_back(obs);
}
template<typename T>
void notify(T value)
{
for (ObsBase* o: _obs)
{
auto* d = dynamic_cast<Observer<T>*>(o);
if(d!=nullptr)
d->update(value, this);
}
}
};

最新更新