C++设计模式 -> 行为型 -> 观察者模式(Observer Pattern)

——————- 抽象事件 | 具体事件 ——————–

这里写图片描述

—————– 抽象观察者 | 具体观察者 ——————

这里写图片描述

逻辑

这里写图片描述

Base_Event.h

#ifndef SUBJECT_H
#define SUBJECT_H


class Base_Observer;

// 抽象事件
class Base_Event
{
public:

    virtual void Add_Observer_Into_Container(Base_Observer *) = 0;  // 观察者集合(容器加入)

    virtual void Delete_Observer_From_Container(Base_Observer *) = 0;  // 观察者集合(容器删除)

    virtual void Event_Appear() = 0;  // 事件发生

protected:

private:
};

#endif // SUBJECT_H

Concrete_Event.h

#ifndef CONCRETE_SUBJECT_H
#define CONCRETE_SUBJECT_H

#include "Base_Event.h"
#include "Base_Observer.h"
#include <iostream>
#include <string>
#include <list>

using namespace std;

// 具体事件
class Concrete_Event : public Base_Event
{
public:
    Concrete_Event(){
        this->event_name = "";
    }

    void Event_Type(string event){
        this->event_name = event;
        cout << event_name << endl;
    }

    void Add_Observer_Into_Container(Base_Observer* observer){
        observer_container.push_back(observer);
    }

    void Delete_Observer_From_Container(Base_Observer* observer){
        observer_container.remove(observer);
    }

    void Event_Appear(){
        list<Base_Observer* >::iterator it = observer_container.begin();
        while (it != observer_container.end()){
            (*it)->Observer_Action(this->event_name);
            ++it;
        }
    }
protected:

private:
    list<Base_Observer* > observer_container;  // 被事件触发的观察者(容器)
    string event_name;
};

#endif // CONCRETE_SUBJECT_H

Base_Observer.h

#ifndef OBSERVER_H
#define OBSERVER_H
#include <iostream>
using namespace std;

// 抽象观察者
class Base_Observer
{
public:

    virtual void Observer_Action(string) = 0;  // 观察者反应动作

protected:
private:
};

#endif // OBSERVER_H#pragma once

Concrete_Observer.h

#ifndef CONCRETE_OBSERVER_H
#define CONCRETE_OBSERVER_H
#include "Base_Observer.h"
#include <iostream>
#include <string>
using namespace std;

// 具体观察者1
class Concrete_Observer1 : public Base_Observer
{
public:
    Concrete_Observer1(string name) :observer_name(name) {}

    void Observer_Action(string event){
        cout << observer_name << " say : i see " << event << endl;
    }
protected:
private:
    string observer_name;  // 名字
};

// 具体观察者2
class Concrete_Observer2 : public Base_Observer
{
public:
    Concrete_Observer2(string name) :observer_name(name) {}

    void Observer_Action(string event){
        cout << observer_name << " say :i see " << event << endl;
    }
protected:
private:
    string observer_name;  // 名字
};


#endif // CONCRETE_OBSERVER_H#pragma once

main.cpp

#include "Concrete_Event.h"
#include "Concrete_Observer.h"

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif

int main()
{
    // 创建主题、观察者
    Concrete_Event* Concrete_Event_Index = new Concrete_Event;
    Base_Observer* people_1_index = new Concrete_Observer1("man");
    Base_Observer* people_2_index = new Concrete_Observer2("women");

    // 在事件里注册观察者
    Concrete_Event_Index->Add_Observer_Into_Container(people_1_index);
    Concrete_Event_Index->Add_Observer_Into_Container(people_2_index);

    // 事件出现
    Concrete_Event_Index->Event_Type("a Dog");
    //事件反应在观察者身上
    Concrete_Event_Index->Event_Appear();

    // 注销观察者
    Concrete_Event_Index->Delete_Observer_From_Container(people_2_index);
    // 事件出现
    Concrete_Event_Index->Event_Type("a Cat ");
    //观察者被事件触发行为
    Concrete_Event_Index->Event_Appear();

    SAFE_DELETE(people_1_index);
    SAFE_DELETE(people_2_index);
    SAFE_DELETE(Concrete_Event_Index);

    getchar();

    return 0;
}

运行结果

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值