用C++11打造智能观察者模式:详解实现步骤完整示例代码("C++11实现智能观察者模式:详细步骤与完整示例代码解析")

原创
ithorizon 6个月前 (10-21) 阅读数 38 #后端开发

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实现智能观察者模式,包括定义观察者和被观察者接口、实现具体的观察者和被观察者类、以及观察者管理器的实现。通过使用智能指针,我们能够自动管理观察者的生命周期,从而避免内存泄漏和野指针问题。智能观察者模式在许多应用场景中都非常有用,特别是在需要动态添加和删除观察者的情况下。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门