模板建站公司,不备案的网站很慢,深圳网站设计go,wordpress ad widget本文介绍观察者模式以及使用函数式编程替代简单的策略模式。
观察者模式 观察者模式是一种行为型设计模式#xff0c;它定义了一种一对多的依赖关系#xff0c;当一个对象的状态发生改变时#xff0c;其所有依赖者都会收到通知并自动更新。 当对象间存在一对多关系时#…本文介绍观察者模式以及使用函数式编程替代简单的策略模式。
观察者模式 观察者模式是一种行为型设计模式它定义了一种一对多的依赖关系当一个对象的状态发生改变时其所有依赖者都会收到通知并自动更新。 当对象间存在一对多关系时则使用观察者模式Observer Pattern。比如当一个对象被修改时则会自动通知依赖它的对象。观察者模式属于行为型模式。 简单来说观察者模式需要多个对象观察同一个对象被观察的对象称为Subject主题Subject需要完成观察者的注册attach注销detach和通知notify三个操作。 首先实现一个公共的Observer父类这个父类只有一个纯虚函数用来更新自身状态
struct Observer
{
public:virtual void update() 0;
};两个具体的类实现 update 函数
struct ConcreteObserver : Observer
{
public:void update() override{std::cout State updated! std::endl;}
};struct ConcreteObserver2 : Observer
{
public:void update() override{std::cout State updated! 2 std::endl;}
};接下来实现被观察者公共类包含添加、删除、通知所有观察者三个接口
struct Subject
{
public:virtual void attach(Observer *observer) 0;virtual void detach(Observer *observer) 0;virtual void notify() 0;
};具体的被观察者类实现这三个接口
struct ConcreteSubject : Subject
{
public:void attach(Observer *observer) override{observers.push_back(observer);}void detach(Observer *observer) override{for (auto it observers.begin(); it ! observers.end(); it){if (*it observer){observers.erase(it);break;}}}void notify() override{for (auto observer : observers){observer-update();}}private:std::vectorObserver * observers;
};测试代码如下
int main()
{ConcreteSubject subject;ConcreteObserver observer1;ConcreteObserver2 observer2;subject.attach(observer1);subject.attach(observer2);subject.notify();subject.detach(observer1);subject.notify();
}函数式编程下的观察者模式
首先需要介绍下C语言的函数指针。所谓函数指针即定义一个指向函数的指针变量格式如下
typedef void (*Callback)();这样就定义了一个变量名为Callback的指针变量指向一个参数为void返回值也为void的函数。我们用这种指针变量就能将整个观察者类改成函数。
两个观察者函数
void callback1()
{std::cout State updated! std::endl;
}void callback2()
{std::cout State updated! 2 std::endl;
}被观察的类。原先调用观察者类的地方全部改为函数调用
struct ConcreteSubject
{
public:void attach(Callback callback){observers.push_back(callback);}void detach(Callback callback){for (auto it observers.begin(); it ! observers.end(); it){if (*it callback){observers.erase(it);break;}}}void notify(){for (auto observer : observers){observer();}}private:std::vectorCallback observers;
};观察者模式与回调
我给函数指针起名为Callback。事实上当只有一个观察者的时候观察者模式的机制就等同于回调模式。因此可以认为回调模式是一种特殊的观察者模式。