c++ - 观察者模式、智能指针和单例类
问题描述
我想使用智能指针创建一个观察者模式。这是我的课:
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 ?是否有任何设计细节需要考虑?
解决方案
我使用了不同的策略:
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);
推荐阅读
- django - 我无法让项目显示在我的表中来自数据库
- arrays - 如何在车把循环数组中使用 lang var?
- google-cloud-platform - 合并文件并存储在字符串中
- ruby - 乘客 + Apache 没有产生 padrino 应用程序
- html - 如何在 HTML 中调用除 (click)="method()" 之外的方法
- java - 如何在 Firebase 中更改未知父级的子级值 - Android
- python - 当 python 程序由 shell 脚本运行时,如何调试它?
- android - 找不到满足版本约束的“androidx.arch.core:core-common”版本
- dll - 使用 ilmerge 命令提示符将 exe 与 dll 合并后,从 exe 开始
- c# - 如何统一使用简单 JSON 从数组数组中获取图像 URL?