设计模式----Observer模式
来源:互联网 发布:部落冲突极速法术数据 编辑:程序博客网 时间:2024/04/28 00:01
在以下任一情况下可以使用观察者模式:
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使他们可以各自独立的改变和复用
2、当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。(即:不希望这些对象是紧密耦合的)
结构思想个人理解核心内容,要想记住这个模式简单的方式就记住三个循环箭头,从右下开始ConcreteObserver----->ConcreteSubject-------->Subject-------->Observer。
首先说明的是,此模式主要是想通过一个对象改变通知其他对象(observer对象)改变。
消息的激发主要是由Subject的notify函数激发,至于什么时候调用notify函数,可以自由设定(1、自动激发,2、客户维护激发时机)
#include <QtCore/QCoreApplication>#include <QList>class Subject;class Observer{public: virtual ~Observer(); virtual void Update(Subject* theChangedSubject) = 0;protected: Observer(); /// >防止实例化};class Subject{public: virtual ~Subject(); virtual void Attach(Observer * o){ m_observers.append(o);} virtual void Detach(Observer * o){ m_observers.removeOne(o);} virtual void Notify() { for(int i=0; i<m_observers.size(); ++i) { m_observers.at(i)->Update(this); } }protected: Subject(); /// >防止实例化private: QList<Observer*> m_observers;};class ClockTimer : public Subject{public: ClockTimer(); void Tick(); /// 每tick一次激发一次notify};void ClockTimer::Tick(){ Notify();}class DigitalClock : public QWidget , public Observer{public: DigitalClock(ClockTimer*); virtual ~DigitalClock(); virtual void Update(Subject *theChangedSubject); virtual void Draw();private: ClockTimer * m_subject;};DigitalClock::DigitalClock(ClockTimer *s){ m_subject = s; m_subject->Attach(this);}DigitalClock::~DigitalClock(){ m_subject->Detach(this);}void DigitalClock::Update(Subject *theChangedSubject){ if(m_subject == theChangedSubject) { Draw(); }}void DigitalClock::Draw(){ //// >绘制时间指针等内容}/// 类似的创建另一个clock为AnalogClockclass AnalogClock{public: AnalogClock(ClockTimer*); virtual ~AnalogClock(); virtual void Update(Subject *theChangedSubject); virtual void Draw();private: ClockTimer * m_subject;};///..... AnalogClock 的实现int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); ClockTimer * timer = new ClockTimer; AnalogClock * aClock = new AnalogClock(timer); DigitalClock * dClock = new DigitalClock(timer); /// >则两个时钟总是显示相同的时间,都通过timer来同事更新 return a.exec();}
- 设计模式:Observer模式
- 设计模式-Observer 模式
- 设计模式----Observer模式
- 设计模式 - Observer模式
- 设计模式----Observer模式
- 【设计模式】Observer模式
- 设计模式--Observer 模式
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之--Observer
- 设计模式之--Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- Poj2266/Poj2270(四元树) .
- 斜堆(Skew Heap)
- tmux 多窗口管理器
- 算法(数据结构)
- 最牛的程序员的自述
- 设计模式----Observer模式
- JQuery checkbox 的选择和判断
- UDP通信
- 优秀博客收藏
- X86汇编学习小结
- TCP与UDP的区别
- Objective-c与js相互调用
- 删除sqlserver 注册机 的方法
- DefaultCellEditor例子