【问题标题】:C++ : Observer PatternC++:观察者模式
【发布时间】: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/…,那么在这种情况下我们应该创建接口吗?如果我们不使用动态多态性并且不尝试使事物通用化,它们仍然有意义吗?如果我的问题很愚蠢,请原谅我。谢谢。
  • 为了让接口以最大的通用性工作,它必须为客户可能需要的所有功能提供虚拟功能。如果客户需要setScoreIObservable 需要setScore。另一种选择是丑陋的客户端 dynamic_casting 到具有 setScore 函数的类型,一旦客户端需要这样做,就告别泛型的说法。
  • 在这两个实现中,哪个更好,为什么???? thispointer.com/… VS medium.com/@gayashanbc/…

标签: c++ design-patterns observers


【解决方案1】:

仅当您覆盖在基类中编写的函数(虚拟)以在派生类中表现不同但此处setScore 未在您的基类中声明时,多态/函数覆盖才有效。所以,多态在这里不起作用。这是你最好的选择

 CricketMatchScore* ob3 = new CricketMatchScore(); //you already used ob1 above, it's a conflicting declaration in your code

Check this Implementation of Observer pattern

【讨论】:

  • 最好的选择是CricketMatchScore ob3;。完全不需要new 和它带来的额外包袱。
  • 好的,知道了。谢谢。
猜你喜欢
  • 2016-02-20
  • 2023-04-10
  • 1970-01-01
  • 2012-02-15
  • 2013-12-30
  • 2011-05-15
  • 2012-08-19
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多