#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;
}