#include<vector>
#include<iostream>
#include<string>
using namespace std;
class Subject;
class Observer{ //观察者抽象类
public:
virtual void update(Subject *base)=0;
protected:
Subject * _subject;
};
class Subject{ //目标抽象类
public:
string s1; //数据值,可以作为私有数据,然后定义一个借口去返回值,这里为了省事
int i1; //数据值
void regiObserver(Observer *obs){
_observer.push_back(obs);
cout<<"已注册"<<endl;
}
void deleObserver(Observer *obs){
_observer.pop_back();
}
void notify(){ //更新所有的观察者
vector<Observer *>::iterator it;
for(it = _observer.begin(); it != _observer.end(); it++)
(*it)->update(this);
}
private:
vector<Observer *> _observer; //观察者容器
};
class FSubject:public Subject{
public:
void set(string s,int i){
s1 = s;
i1 = i;
notify(); //通知观察者。主函数的执行顺序已经保证了所有的观察者都已经进入容器内
}
};
class FObserver :public Observer{ //第一个观察者派生类
public:
FObserver(Subject *base):Observer(){
_subject = base;
_subject->regiObserver(this);
}
void update(Subject *base){
s1 = base->s1;
i1 = base->i1;
display();
}
void display(){
cout<<"更新值,第一个\n"<<s1<<endl;
cout<<i1<<endl;
}
private:
string s1;
int i1;
};
class SObserver:public Observer{ //第二个观察者派生类
public:
SObserver(Subject * base){
_subject = base;
_subject->regiObserver(this);
}
void update(Subject *base){
s1 = base->s1;
i1 = base->i1;
display();
}
void display(){
cout<<"更新值,第二个\n"<<s1<<endl;
cout<<i1<<endl;
}
private:
string s1;
int i1;
};
int main()
{
FSubject * sub = new FSubject;
FObserver * one = new FObserver(sub);
SObserver * two = new SObserver(sub);
sub->set("ok",3);
return 0;
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有