【c++设计模型】之观察者设计模型-创新互联

引言

建网站原本是网站策划师、网络程序员、网页设计师等,应用各种网络程序开发技术和网页设计技术配合操作的协同工作。创新互联建站专业提供做网站、网站建设,网页设计,网站制作(企业站、成都响应式网站建设公司、电商门户网站)等服务,从网站深度策划、搜索引擎友好度优化到用户体验的提升,我们力求做到极致!

用来解决两个不相关对象之间的一对一或者一对多的通信模型。

什么是观察者设计模式

观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接受通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互权限管理等方面也有广泛的应用。

解决的问题

定义了对象间的一种一对多的组合关系,以便一个对象的状态发生时,所有依赖于它的对象都得到通知并自动刷新。

观察者和被观察者之间存在“观察”的逻辑关系,当被观察者发生变化时,观察者就会观察到这样的变化,并作出相应的响应。

编程思路

  1. 设定两者类,一个为观察者类,一个为被观察者类

  2. 观察者类中,定义一个对某个事件感兴趣的处理函数,一般也叫做槽函数

  3. 被观察者类中,定义一个数据结构,用来保存观察者对某一个事件id(信号)感兴趣,使用数据结构建立信号与对象之间的映射关系

  4. 被观察者类中,定义两个方法函数:

    一个方法为:添加观察者与其感兴趣的事件id(信号)加入到容器中

    另一个方法为:信号函数:通知事件函数执行逻辑:首先遍历容器中,有没有感兴趣的事件ID,如果有,则代表一系列的观察者,对这个事件感兴趣,那么再次遍历观察者列表,让每一个观察者执行相应的槽函数

#include#include#includeusing namespace std;

class RecvBase
{
public:
    RecvBase()
    {
        cout<< "RecvBase structure"<<  endl;
    }
    virtual void slotFunctions(int msgid)=0;
    virtual ~RecvBase()
    {
        cout<< "RecvBase destruct"<< endl;
    }
};

class Recv:public RecvBase
{
public:
    Recv()
    {
        cout<< "Recv structure"<< "---"<< this<< "---"<< endl;
    }
    void slotFunctions(int msgid)override
    {
        switch(msgid)
        {
        case 1:
            cout<< this<< "接收到1信号,执行1信号对应的槽函数"<< endl;
            break;
        case 2:
            cout<< this<< "接收到2信号,执行2信号对应的槽函数"<< endl;
            break;
        case 3:
            cout<< this<< "接收到3信号,执行3信号对应的槽函数"<< endl;
            break;
        case 4:
            cout<< this<< "接收到4信号,执行4信号对应的槽函数"<< endl;
            break;
        }
    }
    ~Recv()override
    {
        cout<< "Recv destruct"<< endl;
    }
};

class Sender
{
public:
    Sender()
    {
        cout<< "sender structure"<< endl;
    }
    map>RecvMap;
    void observerToRecvMap(int msgid,RecvBase* recv)
    {
        this->RecvMap[msgid].push_back(recv);
    }
    void senderSignals(int msgid)
    {
        auto it = RecvMap.find(msgid);
        if(it!=RecvMap.end())
        {
            for(RecvBase* p:it->second)
            {
                p->slotFunctions(msgid);
            }
        }else{
            cout<< "接收到未知信号,没有对应的可执行槽函数"<< endl;
        }
    }
    ~Sender()
    {
        cout<< "sender destruct"<< endl;
    }
};

int main()
{
    Sender sender;
    RecvBase* r1=new Recv();
    RecvBase* r2=new Recv();
    RecvBase* r3=new Recv();
    RecvBase* r4=new Recv();

    sender.observerToRecvMap(1,r1);
    sender.observerToRecvMap(1,r2);
    sender.observerToRecvMap(2,r2);
    sender.observerToRecvMap(3,r3);
    sender.observerToRecvMap(4,r4);

    while(true)
    {
        int msgid;
        cin >>msgid;
        if(-1==msgid)break;
        sender.senderSignals(msgid);
    }
    delete r1;
    delete r2;
    delete r3;
    delete r4;
    return 0;
}

知识小百科

this指针

  • 是本对象的起始地址,用const修饰的常地址(原型:stu *const this)(本文代码中this的作用
  • 是隐藏在成员函数(非静态函数)的最左侧的常变量形参

作用

  1. 区别成员属性和成员函数的形参
  2. 解引用,返回本对象的地址

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前题目:【c++设计模型】之观察者设计模型-创新互联
标题路径:http://ybzwz.com/article/djigje.html