设计模式----Observer模式

转自:http://blog.csdn.net/fly542/article/details/6716825

在以下任一情况下可以使用观察者模式:

1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使他们可以各自独立的改变和复用

2、当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。

3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。(即:不希望这些对象是紧密耦合的)

 

 

结构思想个人理解核心内容,要想记住这个模式简单的方式就记住三个循环箭头,从右下开始ConcreteObserver----->ConcreteSubject-------->Subject-------->Observer。

首先说明的是,此模式主要是想通过一个对象改变通知其他对象(observer对象)改变。

消息的激发主要是由Subject的notify函数激发,至于什么时候调用notify函数,可以自由设定(1、自动激发,2、客户维护激发时机)

 

[cpp]  view plain copy
  1. #include <QtCore/QCoreApplication>  
  2.   
  3. #include <QList>  
  4.   
  5. class Subject;  
  6.   
  7. class Observer  
  8. {  
  9. public:  
  10.     virtual ~Observer();  
  11.     virtual void Update(Subject* theChangedSubject) = 0;  
  12. protected:  
  13.     Observer(); /// >防止实例化  
  14. };  
  15.   
  16. class Subject  
  17. {  
  18. public:  
  19.     virtual ~Subject();  
  20.     virtual void Attach(Observer * o){ m_observers.append(o);}  
  21.     virtual void Detach(Observer * o){ m_observers.removeOne(o);}  
  22.     virtual void Notify()  
  23.     {  
  24.         for(int i=0; i<m_observers.size(); ++i)  
  25.         {  
  26.             m_observers.at(i)->Update(this);  
  27.         }  
  28.     }  
  29.   
  30. protected:  
  31.     Subject(); /// >防止实例化  
  32.   
  33. private:  
  34.     QList<Observer*> m_observers;  
  35. };  
  36.   
  37. class ClockTimer : public Subject  
  38. {  
  39. public:  
  40.     ClockTimer();  
  41.   
  42.     void Tick(); /// 每tick一次激发一次notify  
  43. };  
  44.   
  45. void ClockTimer::Tick()  
  46. {  
  47.     Notify();  
  48. }  
  49.   
  50. class DigitalClock : public QWidget , public Observer  
  51. {  
  52. public:  
  53.     DigitalClock(ClockTimer*);  
  54.     virtual ~DigitalClock();  
  55.   
  56.     virtual void Update(Subject *theChangedSubject);  
  57.   
  58.     virtual void Draw();  
  59.   
  60.   
  61. private:  
  62.     ClockTimer * m_subject;  
  63. };  
  64.   
  65. DigitalClock::DigitalClock(ClockTimer *s)  
  66. {  
  67.     m_subject = s;  
  68.     m_subject->Attach(this);  
  69. }  
  70.   
  71. DigitalClock::~DigitalClock()  
  72. {  
  73.     m_subject->Detach(this);  
  74. }  
  75.   
  76. void DigitalClock::Update(Subject *theChangedSubject)  
  77. {  
  78.     if(m_subject == theChangedSubject)  
  79.     {  
  80.         Draw();  
  81.     }  
  82. }  
  83.   
  84. void DigitalClock::Draw()  
  85. {  
  86.      >绘制时间指针等内容  
  87. }  
  88.   
  89. /// 类似的创建另一个clock为AnalogClock  
  90.   
  91. class AnalogClock  
  92. {  
  93. public:  
  94.     AnalogClock(ClockTimer*);  
  95.     virtual ~AnalogClock();  
  96.   
  97.     virtual void Update(Subject *theChangedSubject);  
  98.   
  99.     virtual void Draw();  
  100.   
  101.   
  102. private:  
  103.     ClockTimer * m_subject;  
  104. };  
  105.   
  106. ///..... AnalogClock 的实现  
  107.   
  108.   
  109. int main(int argc, char *argv[])  
  110. {  
  111.     QCoreApplication a(argc, argv);  
  112.   
  113.     ClockTimer * timer = new ClockTimer;  
  114.     AnalogClock * aClock = new AnalogClock(timer);  
  115.     DigitalClock * dClock = new DigitalClock(timer);  
  116.   
  117.     /// >则两个时钟总是显示相同的时间,都通过timer来同事更新  
  118.     return a.exec();  
  119. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值