用C++11打造智能观察者模式:详解实现步骤完整示例代码("C++11实现智能观察者模式:详细步骤与完整示例代码解析")
原创
一、引言
观察者模式是一种行为设计模式,它定义了一种一对多的依赖性关系,当一个对象的状态出现变化时,所有依赖性于该对象的对象都会收到通知并自动更新。在C++中,实现观察者模式通常需要处理对象之间的引用计数和内存管理。C++11引入了智能指针,如shared_ptr和weak_ptr,允许内存管理更加保险和高效。本文将详细介绍怎样使用C++11的智能指针实现智能观察者模式,并给出完整的示例代码。
二、智能观察者模式的基本概念
智能观察者模式是指在观察者模式在出现的同时,利用智能指针来管理观察者和被观察者之间的依赖性关系。这样,当被观察者销毁时,所有观察者也会自动销毁,避免了内存泄漏和野指针的问题。下面是智能观察者模式的基本组成部分:
- 被观察者(Subject):维护观察者列表,并负责通知观察者。
- 观察者(Observer):接收被观察者的通知,并更新自身状态。
- 观察者管理器(Observer Manager):管理观察者列表,利用智能指针维护观察者生命周期的。
三、实现智能观察者模式的步骤
下面是使用C++11实现智能观察者模式的详细步骤:
步骤1:定义观察者接口
首先,我们需要定义一个观察者接口,它包含一个更新方法。
class IObserver {
public:
virtual ~IObserver() {}
virtual void update() = 0; // 纯虚函数,用于更新观察者状态
};
步骤2:定义被观察者接口
被观察者接口包含注册和注销观察者的方法。
class ISubject {
public:
virtual ~ISubject() {}
virtual void attach(IObserverPtr observer) = 0; // 注册观察者
virtual void detach(IObserverPtr observer) = 0; // 注销观察者
virtual void notify() = 0; // 通知所有观察者
};
步骤3:实现具体的观察者类
具体的观察者类实现了更新方法,可以利用需要添加额外的状态和行为。
class ConcreteObserver : public IObserver {
public:
void update() override {
// 更新观察者状态
std::cout << "Observer updated." << std::endl;
}
};
步骤4:实现具体的被观察者类
具体的被观察者类维护观察者列表,并在状态变化时通知所有观察者。
class ConcreteSubject : public ISubject {
private:
std::list
observers; // 观察者列表 public:
void attach(IObserverPtr observer) override {
observers.push_back(observer);
}
void detach(IObserverPtr observer) override {
observers.remove(observer);
}
void notify() override {
for (const auto& observer : observers) {
observer->update();
}
}
};
步骤5:实现观察者管理器
观察者管理器使用智能指针来管理观察者列表,确保观察者的生命周期得到正确管理。
class ObserverManager {
private:
std::list
observers; // 观察者列表 public:
void attach(IObserverPtr observer) {
observers.push_back(observer);
}
void detach(IObserverPtr observer) {
observers.remove(observer);
}
~ObserverManager() {
// 自动销毁所有观察者
}
};
四、完整的示例代码
下面是使用C++11实现智能观察者模式的完整示例代码:
#include
#include
#include
// 观察者接口
class IObserver {
public:
virtual ~IObserver() {}
virtual void update() = 0;
};
// 被观察者接口
class ISubject {
public:
virtual ~ISubject() {}
virtual void attach(IObserverPtr observer) = 0;
virtual void detach(IObserverPtr observer) = 0;
virtual void notify() = 0;
};
// 具体的观察者类
class ConcreteObserver : public IObserver {
public:
void update() override {
std::cout << "Observer updated." << std::endl;
}
};
// 具体的被观察者类
class ConcreteSubject : public ISubject {
private:
std::list
observers; public:
void attach(IObserverPtr observer) override {
observers.push_back(observer);
}
void detach(IObserverPtr observer) override {
observers.remove(observer);
}
void notify() override {
for (const auto& observer : observers) {
observer->update();
}
}
};
// 观察者指针类型定义
typedef std::shared_ptr
IObserverPtr; // 观察者管理器
class ObserverManager {
private:
std::list
observers; public:
void attach(IObserverPtr observer) {
observers.push_back(observer);
}
void detach(IObserverPtr observer) {
observers.remove(observer);
}
~ObserverManager() {
// 自动销毁所有观察者
}
};
int main() {
ObserverManager manager;
ConcreteSubject subject;
// 创建观察者并注册到被观察者
IObserverPtr observer1 = std::make_shared
(); IObserverPtr observer2 = std::make_shared
(); subject.attach(observer1);
subject.attach(observer2);
// 通知观察者
subject.notify();
// 注销观察者
subject.detach(observer1);
// 再次通知观察者
subject.notify();
return 0;
}
五、总结
本文详细介绍了怎样使用C++11实现智能观察者模式,包括定义观察者和被观察者接口、实现具体的观察者和被观察者类、以及观察者管理器的实现。通过使用智能指针,我们能够自动管理观察者的生命周期,从而避免内存泄漏和野指针问题。智能观察者模式在许多应用场景中都非常有用,特别是在需要动态添加和删除观察者的情况下。