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

来源:互联网 发布:绵阳cnc编程招聘 编辑:程序博客网 时间:2024/05/16 17:40

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

这里写图片描述

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

这里写图片描述

逻辑

这里写图片描述

Base_Event.h

#ifndef SUBJECT_H#define SUBJECT_Hclass 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;// 具体观察者1class 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;  // 名字};// 具体观察者2class 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;} }#endifint 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