设计模式:观察者模式(observer)
-
这种设计模式大量的使用,简单的说就是观察者通过被观察者来获得外界某种事物的状态
-
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
如下图:image.png -
被观察者(concreteSubject):其中必然包含了一个观察者的列表,用于状态发生变化的时候通过链表进行通知每个观察者做出相应的变化
-
观察者(ConcreteObserver):其中必然包含各种应对外界状态变化的方法,以供被观察者调用
-
图中还有抽象类Subject和Observer其具体的被观察者和观察者可以通过虚函数从写的方式来重写这些定义好的接口
那么我们做一个列子如下,比如上课的学生等待上课和下课的铃音,那么学生就是观察者上下课铃就是被观察者如下:
点击(此处)折叠或打开
-
/*************************************************************************
-
> File Name: test.cpp
-
> Author: gaopeng QQ:22389860 all right reserved
-
> Mail: gaopp_200217@163.com
-
> Created Time: Sat 25 Nov 2017 05:13:21 AM CST
-
************************************************************************/
-
-
#include<iostream>
-
#include "vector"
-
#include "string"
-
#include<string.h>
-
-
using namespace std;
-
-
-
class StuObserver
-
{
-
-
private:
-
char name[256];
-
public:
-
StuObserver(const char* name)
-
{
-
cout<< name<<"加入学习班!"<<endl;
-
strcpy(this->name,name);
-
}
-
int class_begin()
-
{
-
-
cout<<name<<" 上课开始学习!"<<endl;
-
return 0;
-
}
-
int class_end()
-
{
-
-
cout<<name<<" 结束学习下课!"<<endl;
-
return 0;
-
}
-
};
-
-
-
class bell
-
{
-
-
private:
-
vector<StuObserver* > v;//包含所有观察者
-
int i;
-
public:
-
bell()
-
{
-
i = 0;
-
v.clear();
-
}
-
~ bell()
-
{
-
-
v.clear();
-
for(i=0; i<v.size(); i++)
-
{
-
delete v[i];
-
v[i]=NULL;
-
}
-
}
-
int addObserver(StuObserver *o)
-
{
-
-
v.push_back(o);
-
return 0;
-
}
-
-
int begin_class(const char* class_name)
-
{
-
-
cout<<"每位同学注意:"<<class_name<<"开始了上课了!!"<<endl;
-
for(i=0; i<v.size(); i++)
-
{
-
-
v[i]->class_begin();
-
}
-
return 0;
-
}
-
-
int end_class(const char* class_name)
-
{
-
-
cout<<"每位同学注意:"<<class_name<<"结束了下课了!!"<<endl;
-
for(i=0; i<v.size(); i++)
-
{
-
-
v[i]->class_end();
-
}
-
return 0;
-
}
-
};
-
-
-
-
int main(void)
-
{
-
-
-
bell m;
-
StuObserver* a=new StuObserver("高鹏1");
-
StuObserver* b=new StuObserver("高鹏2");
-
StuObserver* c=new StuObserver("高鹏3");
-
StuObserver* d=new StuObserver("高鹏4");
-
-
m.addObserver(a);
-
m.addObserver(b);
-
m.addObserver(c);
-
m.addObserver(d);
-
-
m.begin_class("数学");
-
m.end_class("数学");
-
m.begin_class("语文");
-
m.end_class("语文");
- }