首页 > 解决方案 > 观察者模式、智能指针和单例类

问题描述

我想使用智能指针创建一个观察者模式。这是我的课:

class Observable {
public:
    void addObserver(std::shared_ptr<Observer> ptr);
private:
    std::list<std::weak_ptr<Observer>> observers;
};

智能指针的使用为内存泄漏提供了强有力的保证,但是当我没有shared_ptr. 单例类的示例:

class Singleton {
private:
  Singleton();
public:
  static Singleton& getInstance() {
      static Singleton instance;
      return instance;
  }
}

在这种情况下,我没有共享 ptr,但单例类可以是观察者。这是否意味着我需要从单例类返回一个 shared_ptr ?是否有任何设计细节需要考虑?

标签: c++c++11

解决方案


我使用了不同的策略:

class ObserverWrapper: public Observer {
public:
  void notify() override {
      ref.notify();
  }
private:
  Observer& ref;
};

class ObserverProxy: public Observer {
public:
    operator std::shared_ptr<Observer>() {
       return wrapper;
    }
    ObserverProxy() : wrapper(std::make_shared<Observer>(*this) {
    }
private:
    std::shared_ptr<Observer> wrapper;
};

class Singleton: public ObserverProxy {
public:
  void notify() override {
      //something here
  }
};

现在我可以这样做:

Singleton& s = Singleton::getInstance();
Observable obs;
obs.addObserver(s);

推荐阅读