观察者模式是一种常见的设计模式,其定义了一种一对多的依赖关系,让多个观察者对象可以同时监听一个被观察对象的状态变化。当被观察对象发生变化时,会通知所有的观察者,使它们能够根据被观察对象的状态自动更新自己的状态。
在 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
observers.push_back(observer);
}
void notify(int value) const {
for (auto observer : observers) {
observer(value);
}
}
private:
std::vector
};
```
这个被观察对象可以像传统的被观察对象一样使用:
```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
observers.push_back(observer);
}
void notify(int value) const {
for (auto observer : observers) {
(*observer)(value);
}
}
private:
std::vector
};
int main() {
Observable observable;
auto observer1 = std::make_shared
std::cout << "Observer 1 observed value " << value << std::endl;
});
observable.subscribe(observer1);
auto observer2 = std::make_shared
std::cout << "Observer 2 observed value " << value << std::endl;
});
observable.subscribe(observer2);
observable.notify(42);
return 0;
}
```
扫码咨询 领取资料