设计模式 - Observer实现

Observer模式的典型实现:

Subject.h NOTE:1.Subject类依赖Obserer接口类。2.Attach又叫Register/Subscribe/AddObserver,Detach又叫Release/Unsubscribe/RemoveObserver。TODO:Attach方法应该判断一个Observer有没有被重复添加。Detach应确保Obserer存在。考虑Subject对象销毁如何通知Observer。

#ifndef DP_SUBJECT_H
#define DP_SUBJECT_H

#include "Observer.h"
#include <list>

class Subject {
public:
  virtual ~Subject() {
    delete observers;
  }
  virtual void Attach(Observer* observer) {
    observers->push_front(observer);
  }
  virtual void Detach(Observer* observer) {
    observers->remove(observer);
  }
  virtual void Notify() {
    std::list<Observer*>::iterator it;
    for (it = observers->begin(); it != observers->end(); ++it) {
      (*it)->Update(this);
    }
  }
protected: Subject() { observers = new std::list<Observer*>; } private: std::list<Observer*>* observers; }; #endif

Observer.h

#ifndef DP_OBSERVER_H
#define DP_OBSERVER_H

class Subject;

class Observer {
public:
  virtual ~Observer() {
  }
  virtual void Update(Subject* subject) = 0;
protected:
  Observer() {
  }
};

#endif

ConcreteSubject.h NOTE:SetState方法里直接调用Notify可以减轻用户负担。

#ifndef DP_CONCRETESUBJECT_H
#define DP_CONCRETESUBJECT_H

#include "Subject.h"
#include <string>
class ConcreteSubject : public Subject { public: ConcreteSubject() : subjectState("") { } void SetState(const std::string& state) { subjectState = state; } std::string GetState() { return subjectState; } private: std::string subjectState; }; #endif

ConcreteObserver.h NOTE:1.细节通过调用GetState向ConcreteSubject查询,属于拉模型。2.要是Update参数包括全部或部分细节,则是推模型。3.定义一个Collection成员存储多个Subject,不在构造函数里初始化绑定Subject,而是通过动态的方式注册,可以实现观察多个Subject。 TODO:Update函数应该对dynamic_cast的异常情况进行处理。

#ifndef DP_CONCRETEOBSERVER_H
#define DP_CONCRETEOBSERVER_H

#include "Observer.h"
#include <string>

class ConcreteSubject;
class ConcreteObserver : public Observer { public: ConcreteObserver(Subject* subject) : observerState("") { this->subject = subject; subject->Attach(this); } virtual ~ConcreteObserver() { subject->Detach(this); delete subject; } virtual void Update(Subject* subject) {
    if (this->subject == subject) {   observerState
= dynamic_cast<ConcreteSubject*>(subject)->GetState();
    } }
private: Subject* subject; std::string observerState; }; #endif

Main.cpp

#include "ConcreteSubject.h"
#include "ConcreteObserver.h"

int main() {
  ConcreteSubject* subject = new ConcreteSubject();
  Observer* observer1 = new ConcreteObserver(subject);
  Observer* observer2 = new ConcreteObserver(subject);

  subject->SetState("A");
  subject->Notify();
  subject->SetState("B");
  subject->Notify();

  return 0;
}

 

转载于:https://www.cnblogs.com/chenkkkabc/archive/2013/06/15/3137804.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值