【发布时间】:2021-11-22 16:39:25
【问题描述】:
在不将 setScore() 添加到 IObserver 的情况下编写它的效率如何?有没有更好的方法添加这种方法?还是比这更好的实现?请帮忙。
ObserverPattern.cpp:88:7: 错误:‘class IObservable’没有名为‘setScore’的成员
//interface
class IObserver
{
public:
virtual void update(int) = 0;
};
//interface
class IObservable
{
public:
virtual void subscribe(IObserver *) = 0;
virtual void unsubscribe(IObserver *) = 0;
virtual void notifyAll() = 0;
};
class CricketMatchScore : public IObservable
{
public:
CricketMatchScore()
: mScore (0)
{
}
void subscribe(IObserver * obj)
{
mObservers.push_back(obj);
}
virtual void unsubscribe(IObserver * obj)
{
auto iter = std::find(mObservers.begin(), mObservers.end(), obj);
if (iter != mObservers.end())
{
mObservers.erase(iter);
}
}
void notifyAll()
{
for (auto & item : mObservers)
{
item->update(mScore);
}
}
void virtual setScore(int score)
{
if (mScore != score)
{
mScore = score;
notifyAll();
}
}
private:
std::vector<IObserver*> mObservers;
int mScore;
};
class CricInfo : public IObserver
{
public:
void update(int score)
{
std::cout<<score<<std::endl;
}
};
int main()
{
IObserver * ob1 = new CricInfo;
IObserver * ob2 = new CricInfo;
IObservable * obl = new CricketMatchScore;
obl->subscribe(ob1);
obl->subscribe(ob2);
obl->setScore(20);
return 0;
}
【问题讨论】:
-
为什么使用
IObservable*作为obl的类型,而您可以使用CricketMatchScore*(或者实际上是CricketMatchScore,因为这里没有理由使用动态分配)? -
感谢弗雷德的回复。我刚刚经历了实现@medium.com/@gayashanbc/…,那么在这种情况下我们应该创建接口吗?如果我们不使用动态多态性并且不尝试使事物通用化,它们仍然有意义吗?如果我的问题很愚蠢,请原谅我。谢谢。
-
为了让接口以最大的通用性工作,它必须为客户可能需要的所有功能提供虚拟功能。如果客户需要
setScore,IObservable需要setScore。另一种选择是丑陋的客户端dynamic_casting 到具有setScore函数的类型,一旦客户端需要这样做,就告别泛型的说法。 -
在这两个实现中,哪个更好,为什么???? thispointer.com/… VS medium.com/@gayashanbc/…
标签: c++ design-patterns observers