观察者模式 observer

观察者模式是应该掌握的几种重要的模式之一,它的用处广泛,而且其变种更能解决许多实际问题。下面详细的介绍一下。名称:观察者模式--Observer别名:Dependents, Publish-Subscribe意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。下面用一个教师-学生的例子说明观察者模式,其中学生是观察者,教师是被观察者,不过这个也适用于电器-开关的例子,可以把电器看作观察者,开关看作被观察者,当开关开始有动作的时候,观察者接收到信息://-------------------------------------------------------------------//   Subject.h        被观察对象//-------------------------------------------------------------------

#ifndef SUBJECT_H#define SUBJECT_H#include "Observer.h"class Observer;class Subject{public:    virtual ~Subject(){}    virtual void Attach(Observer *aObserver) = 0;    virtual void Talk() = 0;    virtual char *GetContent() const = 0;    virtual void SetContent(char *aContent) = 0;protected:    Subject(){};};#endif//--------------------------------------------------------------------------//     Teacher.h//--------------------------------------------------------------------------#ifndef TEACHER_H#define TEACHER_H#include "Subject.h"#include <list>#include <iterator>class Teacher : public Subject{public:    Teacher();    virtual void Attach(Observer *aObserver);    virtual void Talk();    virtual char *GetContent() const;    virtual void SetContent(char *aContent);private:    std::list<Observer *> observerList;    char *content;};#endif;//---------------------------------------------------------------------//     Teacher.cpp//---------------------------------------------------------------------#include "Teacher.h"Teacher::Teacher(){    content = "现在开始上课";}void Teacher::Attach(Observer *aObserver){    observerList.push_back(aObserver);}void Teacher::SetContent(char *aContent){    content = aContent;}void Teacher::Talk(){    std::list<Observer *>::iterator students;    for(students = observerList.begin() ; students != observerList.end() ; ++students)    {        ((Observer *)(*students))->Listen(this);    }}char *Teacher::GetContent() const{    return content;}//--------------------------------------------------------------------------------//     Observer.h             观察者//--------------------------------------------------------------------------------#ifndef OBSERVER_H#define OBSERVER_H#include "Subject.h"class Subject;class Observer{public:    virtual void Listen(Subject *aSubject) = 0;    virtual ~Observer(){}protected:    Observer(){};};#endif//------------------------------------------------------------------------//    Student.h//------------------------------------------------------------------------#ifndef STUDENT_H#define STUDENT_H#include "Observer.h"class Student : public Observer{public:    Student(char* = "学生");    char *GetName() const;    virtual void Listen(Subject *aSubject);private:    char *name;};#endif//----------------------------------------------------------------//    Student.cpp//----------------------------------------------------------------#include <iostream>#include "Student.h"Student::Student(char *aName){    name = aName;}void Student::Listen(Subject *aSubject){    std::cout << GetName() << ":老师刚才说," << aSubject->GetContent() << std::endl;}char *Student::GetName() const{    return name;}//-------------------------------------------------------------//     demo.cpp//-------------------------------------------------------------#include "Student.h"#include "Teacher.h"int main(){    Student *student1 = new Student("张三");    Student *student2 = new Student("李四");    Student *student3 = new Student("王五");    Teacher teacher;    teacher.Attach(student1);    teacher.Attach(student2);    teacher.Attach(student3);    teacher.Talk();    teacher.SetContent("今天我们一起来学习C++");    teacher.Talk();    std::system("PAUSE");    return 0;} 
 
在此实例中还使用了迭代器模式,可以用工厂模式优化创建多个观察者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值