博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Observer模式
阅读量:4133 次
发布时间:2019-05-25

本文共 3515 字,大约阅读时间需要 11 分钟。

Observer模式要解决的问题:建立一个一(Subject)对多(Observer)的依赖关系,当“一”变化的时候,依赖这个“一”的多也能够同步改变

Subject.h

//Subject.h#ifndef _SUBJECT_H_#define _SUBJECT_H_#include 
#include
using namespace std;typedef string State;class Observer;class Subject{public: virtual ~Subject(); virtual void Attach(Observer* obv); virtual void Detach(Observer* obv); virtual void Notify(); virtual void SetState(const State& st) = 0; virtual State GetState() = 0;protected: Subject();private: list
* _obvs;};class ConcreteSubject:public Subject{public: ConcreteSubject(); ~ConcreteSubject(); State GetState(); void SetState(const State& st);protected:private: State _st;};#endif //~_SUBJECT_H_
Subject.cpp

#include "Subject.h"#include "Observer.h"#include 
#include
using namespace std;typedef string state;Subject::Subject(){ //在模板的使用之前一定要new,创建 _obvs = new list
;}Subject::~Subject(){ }void Subject::Attach(Observer* obv){ _obvs->push_front(obv);}void Subject::Detach(Observer* obv){ if (obv != NULL) _obvs->remove(obv);}void Subject::Notify(){ list
::iterator it; it = _obvs->begin(); for (;it != _obvs->end();it++) { //关于模板和iterator的用法 (*it)->Update(this); }}ConcreteSubject::ConcreteSubject(){ _st = '\0';}ConcreteSubject::~ConcreteSubject(){ }State ConcreteSubject::GetState(){ return _st;}void ConcreteSubject::SetState(const State& st){ _st = st;}
Observer.h

//Observer.h#ifndef _OBSERVER_H_#define _OBSERVER_H_#include "Subject.h"#include 
using namespace std;typedef string State;class Observer{public: virtual ~Observer(); virtual void Update(Subject* sub) = 0; virtual void PrintInfo() = 0;protected: Observer(); State _st;private:};class ConcreteObserverA:public Observer{public: virtual Subject* GetSubject(); ConcreteObserverA(Subject* sub); virtual ~ConcreteObserverA(); //传入Subject作为参数,这样可以让一个View属于多个的Subject。 void Update(Subject* sub); void PrintInfo();protected:private: Subject* _sub;};class ConcreteObserverB:public Observer{public: virtual Subject* GetSubject(); ConcreteObserverB(Subject* sub); virtual ~ConcreteObserverB(); //传入Subject作为参数,这样可以让一个View属于多个的Subject。 void Update(Subject* sub); void PrintInfo();protected:private: Subject* _sub;};#endif //~_OBSERVER_H_
Observer.cpp

//Observer.cpp#include "Observer.h"#include "Subject.h"#include 
#include
using namespace std;Observer::Observer(){ _st = '\0';}Observer::~Observer(){}ConcreteObserverA::ConcreteObserverA(Subject* sub){ _sub = sub; _sub->Attach(this);}ConcreteObserverA::~ConcreteObserverA(){ _sub->Detach(this); if (_sub != 0) delete _sub;}Subject* ConcreteObserverA::GetSubject(){ return _sub;}void ConcreteObserverA::PrintInfo(){ cout<<"ConcreteObserverA observer.... "<<_sub->GetState()<
GetState(); PrintInfo();}ConcreteObserverB::ConcreteObserverB(Subject* sub){ _sub = sub; _sub->Attach(this);}ConcreteObserverB::~ConcreteObserverB(){ _sub->Detach(this); if (_sub != 0) { delete _sub; }}Subject* ConcreteObserverB::GetSubject(){ return _sub;}void ConcreteObserverB::PrintInfo(){ cout<<"ConcreteObserverB observer.... "<<_sub->GetState()<
GetState(); PrintInfo();}
main.cpp

#include "Subject.h"#include "Observer.h"#include 
using namespace std;int main(){ ConcreteSubject* sub = new ConcreteSubject(); Observer* o1 = new ConcreteObserverA(sub); Observer* o2 = new ConcreteObserverB(sub); sub->SetState("old"); sub->Notify(); sub->SetState("new"); //也可以由Observer调用 sub->Notify(); return 0;}

转载地址:http://pjvvi.baihongyu.com/

你可能感兴趣的文章
图片轮播
查看>>
项目必备!永无 bug 注释
查看>>
webView 属性方法大全
查看>>
ios 常用的30个动画效果
查看>>
iOS开发中的手势体系——UIGestureRecognizer分析及其子类的使用
查看>>
iOS图片压缩处理
查看>>
Lab、TextView文字两端对齐(中英文、标点、空格换行)
查看>>
Android进阶学习方法总结(内附阿里P7进阶学习全套资料)
查看>>
秃头警告!我把Github上6k星的Android性能优化教程和实战项目整合成了一个PDF文档
查看>>
程序员狂怒:薪水被应届生倒挂了,很不爽,天王老子也别想留住我!
查看>>
35岁程序员:“鞠躬尽瘁,死而...” 算了,我还是转行吧!
查看>>
c语言数据结构实现-数组队列/环形队列
查看>>
c语言数据结构实现-链式队列
查看>>
[学习总结】C语言
查看>>
抽象数据类型——表
查看>>
读《历史上的三种人》
查看>>
Leecode 记录——Remove Nth Node From End of List
查看>>
Leecode记录——Valid Palindrome
查看>>
leetcode记录——Count and Say
查看>>
Leetcode 记录——Happy Number
查看>>