希赛考试网
首页 > 软考 > 软件设计师

观察者模式 c++11

希赛网 2024-06-09 09:57:26

观察者模式是一种常见的设计模式,其定义了一种一对多的依赖关系,让多个观察者对象可以同时监听一个被观察对象的状态变化。当被观察对象发生变化时,会通知所有的观察者,使它们能够根据被观察对象的状态自动更新自己的状态。

在 c++11 中,加入了 lambda 表达式和 std::function 类型,可以更方便地实现观察者模式。下面从多个角度分析这种实现方式。

Lambda 表达式的使用

在传统的观察者模式中,需要定义一个观察者接口,并在被观察对象中维护一个包含所有观察者的列表,需要通过添加和删除观察者等方式维护这个列表。而在 c++11 中,可以使用 lambda 表达式作为观察者行为,这样就不必再定义接口和维护列表了。

Lambda 可以捕获外部变量,在观察者执行时,可以使用这些变量。例如,可以定义一个输出观察者:

```cpp

auto observer = [](int value) {

std::cout << "Observed value is " << value << std::endl;

};

```

然后就可以把这个观察者以 lambda 表达式的方式添加到被观察对象中:

```cpp

class Observable {

public:

void subscribe(std::function observer) {

observers.push_back(observer);

}

void notify(int value) const {

for (auto observer : observers) {

observer(value);

}

}

private:

std::vector > observers;

};

```

这个被观察对象可以像传统的被观察对象一样使用:

```cpp

Observable observable;

observable.subscribe(observer);

observable.notify(42); // "Observed value is 42"

```

std::function 类型

观察者模式的另一个优化是使用 std::function 类型。这个类型是一个函数对象的封装,可以用来表示任意可调用对象,包括函数指针、成员函数指针、函数对象和 lambda 表达式等。

使用 std::function 类型,可以减少观察者之间复杂的继承关系,并且可以使用 std::bind 绑定成员函数指针作为观察者,甚至可以传递函数对象,从而实现更加灵活的观察者模式。

实现示例

下面是一个使用 lambda 表达式和 std::function 类型的观察者模式实现示例,其中使用了 std::shared_ptr 作为观察者的类型,这样就不必手动维护观察者列表了:

```cpp

#include

#include

#include

#include

class Observable {

public:

void subscribe(std::shared_ptr > observer) {

observers.push_back(observer);

}

void notify(int value) const {

for (auto observer : observers) {

(*observer)(value);

}

}

private:

std::vector >> observers;

};

int main() {

Observable observable;

auto observer1 = std::make_shared >([](int value) {

std::cout << "Observer 1 observed value " << value << std::endl;

});

observable.subscribe(observer1);

auto observer2 = std::make_shared >([](int value) {

std::cout << "Observer 2 observed value " << value << std::endl;

});

observable.subscribe(observer2);

observable.notify(42);

return 0;

}

```

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件