. 观察这模式,这个模式也是一个挺简单的模式。我开设了一个“宅男福利”的一个服务。每天我会不定时更新资源“发送”给订阅了“宅男福利”服务的“群众”。不明白的话就看看手机微信里面的公众号吧。每当公众号有新的内容就会推送给订阅的用户,你取消关注了微信公众号就不会再有推送。 观察者模式就这么个意思。
不过我写到这里的时候脑子里又冒出来感觉不就是一个TCP连接么。。
//观察者基类 class Observer { public: Observer(){}; virtual ~Observer(){}; //当被观察者有新的数据来时会调用这个函数。 //其中参数就是被观察者提供给观察者所能看到的数据。 virtual void updata(int n1, int n2, int n3) = 0; }; //服务对象基类 class Subject { public: Subject(){}; virtual ~Subject(){}; public: //注册观察者 virtual void registerObserver(Observer* o) = 0; //移除观察者 virtual void removeObserver(Observer* o) = 0; //更新信息 virtual void notifyObserver() = 0; }; //显示 class DispayElement { public: DispayElement(){}; virtual ~DispayElement(){}; virtual void display() = 0; }; //你可以看做是某个微信公众号 class WeatherData : public Subject { public: WeatherData(){}; virtual ~WeatherData(){}; public: //注册观察者,当有用户订阅这个微信号 virtual void registerObserver(Observer* o) { //将用户this指针存储起来 m_Arry.push_back(o); } //移除观察者,当用户决定取消订阅这个微信号 virtual void removeObserver(Observer* o) { list<Observer*>::iterator it; for (it = m_Arry.begin(); it != m_Arry.end(); it++) { //找到他的ID if ((*it) == o) { //移除他 it = m_Arry.erase(it); } } } //更新信息 virtual void notifyObserver() { list<Observer*>::iterator it; for (it = m_Arry.begin(); it != m_Arry.end(); it++) { //新的内容发送给所有订阅了当前公众号的围观者。 (*it)->updata(n1, n2, n3); } } void measurementsChanged() { notifyObserver(); } //当有新的信息更新时 void setMeasurements(int n1, int n2, int n3) { this->n1 = n1; this->n2 = n2; this->n3 = n3; measurementsChanged(); } private: list<Observer*> m_Arry; int n1; int n2; int n3; }; //这是张三 class ZhangSan : public Observer, public DispayElement { public: ZhangSan(Subject *weatherData) { //构造时就订阅了这个公众微信号 this->weatherData = weatherData; //如果不明白这里为什么可以传递,自行翻阅C++基础书籍或《c++反汇编与逆向分析技术揭秘·钱林松》 weatherData->registerObserver(this); }; virtual ~ZhangSan(){}; //当公众号有更新时自动调用这里 virtual void updata(int n1, int n2, int n3) { this->n1 = n1; this->n2 = n2; this->n3 = n3; //更新后立即显示 display(); } virtual void display() { printf("zhangsan : n1 = %d n2 = %d n3 = %d \r\n", n1, n2, n3); } private: int n1; int n2; int n3; //为什么要存储一个公众号的指针。 //因为 Subject *weatherData; }; class LiSi : public Observer, public DispayElement { public: LiSi(Subject *weatherData) { this->weatherData = weatherData; weatherData->registerObserver(this); }; virtual ~LiSi(){}; virtual void updata(int n1, int n2, int n3) { this->n1 = n1; this->n2 = n2; this->n3 = n3; display(); } virtual void display() { printf("LiSi : n1 = %d n2 = %d n3 = %d \r\n", n1, n2, n3); } void remove() { weatherData->removeObserver(this); } private: int n1; int n2; int n3; Subject *weatherData; }; int main() { WeatherData *WeiXinFuWuHao= new WeatherData; ZhangSan *z3 = new ZhangSan(WeiXinFuWuHao); LiSi *l4 = new LiSi(WeiXinFuWuHao); //推送新的信息 WeiXinFuWuHao->setMeasurements(1, 2, 3); WeiXinFuWuHao->setMeasurements(4, 5, 6); //Li4决定取消关注 l4->remove(); WeiXinFuWuHao->setMeasurements(7, 8, 9); return 0; }
发表评论