观察者设计模式

#include <iostream>

#include <string>

#include <list>

using namespace std;

class Subject;

//观察者

class Observer {  //抽象的观察者

public:

    Observer(){}

    ~Observer(){}

    virtual void update(Subject * aSubject) = 0;

    

};

//目标(被观察者)

class Subject {   //抽象的主题

public:

    Subject(){}

    ~Subject(){}

    virtual void notice() = 0;//通知观察者

    virtual void attach(Observer* myObserve) = 0;//添加观察者

    virtual void detach(Observer*myObserve) = 0;//移除观察者

public:

    virtual void speak() = 0;

    virtual void setContent(string c) = 0;

    virtual string getContent() = 0;

    

};



class Student:public Observer {//具体观察者

public:

    Student(){}

    Student(string name)

    {

        this->name = name;

    }

    ~Student(){}

    //更新内容

    void update(Subject* aSubject)

    {

        show(aSubject);

    }

    

    

    void show(Subject *aSubject)

    {

        cout<<"Name: "<<this->name<<"Teacher' speak: "<<aSubject->getContent()<<endl;

    }

private:

    string name;

};


//具体目标  Teacher

class Teacher:public Subject {

public:

    Teacher()

    {

        content = "现在开始上课!";

    }

    ~Teacher(){}

public:

     void notice()//通知观察者

    {

        cout<<"notice to Observe\n";

        list<Student*>::iterator iter;

        for (iter  = studentList.begin();iter != studentList.end(); iter++)

        {

            ((Observer*)(*iter))->update(this);

        }

        

    }

     void attach(Observer* myObserve)//添加观察者

    {

        studentList.push_back((Student*)myObserve);

        cout<<"Attach an Observer\n";

  

    }

     void detach(Observer*myObserve)//移除观察者

    {

        list<Student*>::iterator iter;

        iter = find(studentList.begin(), studentList.end(), myObserve);

        if (iter != studentList.end())

        {

            studentList.erase(iter);

        }

        cout<<"Detach an Observer\n";

    }

    

    

public:

     void speak()

    {

        list<Student*>::iterator iter;

        for (iter  = studentList.begin(); iter != studentList.end(); iter++)

        {

            ((Observer*)(*iter))->update(this);

        }

    }

     void setContent(string c)

    {

        this->content = c;//信息改变

        notice();//立刻发出通知

    }

     string getContent()

    {

        return content;

    }

    

private:

    string content;

    list<Student*>studentList;

};

//测试函数

void test()

{

    Teacher teacher; //定义被观察者

    

    //定义观察者

    Student *student1 = new Student("张三");

    Student *student2 = new Student("李四");

    Student *student3 = new Student("王五");

    //添加观察者

    teacher.attach(student1);

    teacher.attach(student2);

    teacher.attach(student3);

    

    teacher.speak();

    

    //被观察者信息改变

    teacher.setContent("今天学习观察者模式!");

    

    teacher.setContent("时间到,下课!");

    

    //移除观察者

    

    teacher.detach(student1);

    

    teacher.setContent("张三今天外面站着!");

//    teacher.detach(student2);

//    teacher.detach(student3);

    

    //释放堆内存

    delete student1;

    delete student2;

    delete student3;

}

int main(int argc, const char * argv[]) {

    test();


    return 0;

}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值