思考如下情况:Observer类作为观察者,Handler类作为被观察者负责具体的任务执行,当任务执行完毕以后通知观察者完成。Observer收到调用以后删除Handler类。以下代码安全吗?
结果:
安全。
不优雅。
handler在通过调用notify接口以后还可以访问自己的资源吗?可以,但是会得到随机值。
/* 这里是一个观察者类:开始工作时创建Handler类,并且把自己的notify函数通过this指针暴露给Handler作为回调函数使用 */ class Observer { public: void start() { int id = getId(); map_[id] = std::make_unique
(id, this); map_[id]->start(); } void notify(int id) { auto it = map_.find(id); if (it != map_.end()) { printf("erase task=%d\n", id); map_.erase(it); } } private: int id_ { 0 }; std::map<int, std::unique_ptr > map_; }; /* 这里是Handler类:完成工作以后通过Observer的指针直接调用notify函数 / class Handler { public: Handler(int id, Observer observer): id_(id), observer_(observer){} void start() { observer_->notify(id_); } private: int id_; Observer* observer_; };