如果你能理解委托,那么观察者模式对你来说很简单。委托,就是在一个类A里包含另一个类B的对象的指针作为本类的数据成员。因此此类A就有了调用类B里函数成员的能力。观察者模式的本质就是托管。在代码中可以清楚看到这些。下面的案例中主体(相当类A)添加了list链表来存储多个来自观察者类(相当于类B)的对象实例的指针。
这些代码都是在学习这些的过程中码的。。。。。
上代码,亲测有效!
#include <iostream>
#include <string>
#include <list>
using namespace std;
//情景: 多对一的依赖关系,一个状态发生改变
//使得其他观察者状态也发生改变
//观察者
class Observer
{
public:
//状态
bool state = false;
//主体改变状态后此函数被调用
//完成Observe更新状态
void UpData()
{
cout << "观察者改变前obState: " << state << endl;
state = state ? false : true;
cout << "观察者改变后obState: " << state << endl;
}
};
//主体
class Object
{
public:
//状态
bool state = false;
list<Observer*> myList;
//增加观察者
void AddObserver(Observer* observer)
{
myList.push_back(observer);
}
//删除观察者
void DeleteObserver(Observer* observer)
{
myList.remove(observer);
}
//通知观察者
void Notify()
{
int i = 1;
for (list<Observer* >::iterator iter = myList.begin(); iter != myList.end(); iter++)
{
printf("已通知观察者%d\n", i);
(*iter)->UpData();
i++;
}
}
//改变状态
void ChangeState()
{
cout << "主体改变前obState: " << state << endl;
state = state ? false : true;
cout << "主体改变后obState: " << state << endl;
//改变后通知观察者
Notify();
}
//获得当前状态
bool GetState()
{
return state;
}
};
int main(void)
{
//实例化主体
Object* object = new Object;
//实例化观察者
Observer* observer_1 = new Observer;
Observer* observer_2 = new Observer;
//添加观察者
object->AddObserver(observer_1);
object->AddObserver(observer_2);
//改变主体的状态
object->ChangeState();
system("pause");
return 0;
}