设计模式----Observer模式
2011-08-25 00:00
106 查看
在以下任一情况下可以使用观察者模式:
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使他们可以各自独立的改变和复用
2、当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。(即:不希望这些对象是紧密耦合的)
结构思想个人理解核心内容,要想记住这个模式简单的方式就记住三个循环箭头,从右下开始ConcreteObserver----->ConcreteSubject-------->Subject-------->Observer。
首先说明的是,此模式主要是想通过一个对象改变通知其他对象(observer对象)改变。
消息的激发主要是由Subject的notify函数激发,至于什么时候调用notify函数,可以自由设定(1、自动激发,2、客户维护激发时机)
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为AnalogClock class 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 Pattern)
- 委托、事件与Observer设计模式
- 设计模式之十六------Observer(观察者)
- 设计模式学习笔记(二十一)——Observer观察者
- 设计模式之Observer(转载)
- 设计模式之四 观察者模式(Observer Pattern)
- 设计模式之 观察者模式 the observer design pattern
- 设计模式-观察者模式(observer pattern)
- 设计模式-- 观察者模式Observer(对象行为型)
- 设计模式—行为型-Observer(观察者)
- JAVA设计模式—观察者模式(Observer)
- C#设计模式系列:观察者模式(Observer)
- 设计模式之观察者模式(Observer)
- JAVA设计模式-Observer模式
- 设计模式解析和实现(C++)之十五-Observer模式
- 设计模式之Observer(观察者)模式
- 设计模式之Observer观察者模式
- Java读书笔记12 事件处理基础 Observer设计模式
- 设计模式的征途—15.观察者(Observer)模式
- PHP设计模式 观察者模式(Observer)