C++常用23种设计模式总结(二)------观察者模式

往期回顾
C++常用23种设计模式总结(一)------单例模式

什么是观察者模式

观察者模式是一种设计模式,它允许对象之间建立一对多的依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。

在C++中,观察者模式可以通过以下步骤实现:

创建一个抽象主题类(Subject),该类定义了主题(被观察者)必须实现的方法,包括添加和删除观察者以及通知观察者的方法。
创建一个抽象观察者类(Observer),该类定义了观察者必须实现的方法,包括更新方法。
创建具体主题类(ConcreteSubject),该类继承了抽象主题类,并实现了具体的方法。在状态发生改变时,具体主题类会通知观察者。
创建具体观察者类(ConcreteObserver),该类继承了抽象观察者类,并实现了具体的更新方法。具体观察者类可以通过具体主题类注册为观察者,从而接收状态更新通知。
使用观察者模式,可以实现松耦合的系统,使得各个对象之间相互独立。同时也提供了更好的可扩展性和灵活性,因为可以动态地添加或删除观察者对象,而不需要修改主题代码。

具体实现如下

1、首先创建两个抽象类

class AbstractSubject           //抽象主题
{
public:
        virtual void add(AbstractObserver * obs) = 0;
        virtual void del(AbstractObserver * obs) = 0;
        virtual void notify() = 0;
};


class AbstractObserver          //抽象观察者
{
public:
    virtual void update() = 0;
};

2、重写这两个接口

class Subject : public AbstractSubject //主题具体实现
{
public:
    Subject()
    { 
        std::cout<<" Create Subject"<<std::endl; 
    };
    ~Subject() { };

public:
    void add(AbstractObserver * obs) override
    {
        m_observers.push_back(obs);
    }
    void del(AbstractObserver * obs) override
    {

    }
    void notify() override
    {
        for(auto iter : m_observers)
        {
            iter->update();
        }
    }

    void setValue(std::string value)
    {
        m_val = value;
        notify();
    }
    std::string getValue()
    {
        return m_val;
    }


private:
    std::string m_val;
    std::vector<AbstractObserver *> m_observers;
};



class Observer : public AbstractObserver   //观察者具体实现
{

public:
    Observer(Subject* Subject)
    :m_Subject(Subject)
    {

    }

public:
    void update() override
    {
        std::cout<<"recv : "<<m_Subject->getValue()<<std::endl;
    }

private:
    Subject* m_Subject;
};

完整测试代码

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class AbstractObserver;
class AbstractSubject           //抽象主题
{
public:
        virtual void add(AbstractObserver * obs) = 0;
        virtual void del(AbstractObserver * obs) = 0;
        virtual void notify() = 0;
};


class AbstractObserver          //抽象观察者
{
public:
    virtual void update() = 0;
};


class Subject : public AbstractSubject
{
public:
    Subject()
    { 
        std::cout<<" Create Subject"<<std::endl; 
    };
    ~Subject() { };

public:
    void add(AbstractObserver * obs) override
    {
        m_observers.push_back(obs);
    }
    void del(AbstractObserver * obs) override
    {

    }
    void notify() override
    {
        for(auto iter : m_observers)
        {
            iter->update();
        }
    }

    void setValue(std::string value)
    {
        m_val = value;
        notify();
    }
    std::string getValue()
    {
        return m_val;
    }


private:
    std::string m_val;
    std::vector<AbstractObserver *> m_observers;
};



class Observer : public AbstractObserver
{

public:
    Observer(Subject* Subject)
    :m_Subject(Subject)
    {

    }

public:
    void update() override
    {
        std::cout<<"recv : "<<m_Subject->getValue()<<std::endl;
    }

private:
    Subject* m_Subject;
};

int main()
{
    //创建主题
    Subject * sub = new Subject();
    //创建监控者
    AbstractObserver * obs1 = new Observer(sub);
    AbstractObserver * obs2 = new Observer(sub);

    sub->add(obs1);
    sub->add(obs2);

    sub->setValue("hello");

    delete sub;
    delete obs1;
    delete obs2;

    sub = nullptr;
    obs1 = nullptr;
    obs2 = nullptr;

    return 0;
}

运行结果

 Create Subject
recv : hello
recv : hello
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值