C++设计模式中的观察者模式一起来看看

 

设计模式:观察者模式

观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。

  • 发布者接口
#ifndef __observerPatterns_publish_hpp__
#define __observerPatterns_publish_hpp__

#include "observerPatterns_subscribe.hpp"

class observerPatterns_publish
{
public:
  virtual void registerObjectSubscribe(observerPatterns_subscribe *ops) = 0;
  virtual void removeObjectSubscribe(observerPatterns_subscribe *ops) = 0;
  virtual void notifyObjectSubscribe() = 0;
};

#endif
  • 订阅者接口
#ifndef __observerPatterns_subscribe_hpp__
#define __observerPatterns_subscribe_hpp__

#include "observerPatterns_common.hpp"

class observerPatterns_subscribe
{
public:
  virtual void update(const observerPatterns_msgPackage &opmp) = 0;
};

#endif
  • 发布者类
#ifndef __observerPatterns_object_publish_hpp__
#define __observerPatterns_object_publish_hpp__

#include <unordered_set>
#include "observerPatterns_publish.hpp"

class observerPatterns_object_publish : public observerPatterns_publish
{
private:
  observerPatterns_msgPackage _opmp;
  std::unordered_set<observerPatterns_subscribe *> _subscribeObjectBucket;
public:
  observerPatterns_object_publish();
  ~observerPatterns_object_publish();
  void registerObjectSubscribe(observerPatterns_subscribe *ops);
  void removeObjectSubscribe(observerPatterns_subscribe *ops);
  void notifyObjectSubscribe();
  void setMsgPackage(const observerPatterns_msgPackage &opmp);
};

observerPatterns_object_publish::observerPatterns_object_publish()
{
}

observerPatterns_object_publish::~observerPatterns_object_publish()
{
}

void observerPatterns_object_publish::registerObjectSubscribe(observerPatterns_subscribe *ops)
{
  _subscribeObjectBucket.insert(ops);
}

void observerPatterns_object_publish::removeObjectSubscribe(observerPatterns_subscribe *ops)
{
  _subscribeObjectBucket.erase(ops);
}

void observerPatterns_object_publish::notifyObjectSubscribe()
{
  for (auto &&_sob : _subscribeObjectBucket)
      _sob->update(_opmp);
}

void observerPatterns_object_publish::setMsgPackage(const observerPatterns_msgPackage &opmp)
{
  _opmp = opmp;
  notifyObjectSubscribe();
}

#endif
  • 订阅者类
#ifndef __observerPatterns_object_subscribe_hpp__
#define __observerPatterns_object_subscribe_hpp__

#include "observerPatterns_publish.hpp"
#include "observerPatterns_subscribe.hpp"

class observerPatterns_object_subscribe : public observerPatterns_subscribe
{
private:
  observerPatterns_msgPackage _opmp;
  observerPatterns_publish *_opb;
public:
  observerPatterns_object_subscribe(observerPatterns_publish *opb);
  ~observerPatterns_object_subscribe();
  void update(const observerPatterns_msgPackage &opmp);
};

observerPatterns_object_subscribe::observerPatterns_object_subscribe(observerPatterns_publish *opb)
  :_opb(opb)
{
  _opb->registerObjectSubscribe(this);
}

observerPatterns_object_subscribe::~observerPatterns_object_subscribe()
{
  _opb->removeObjectSubscribe(this);
}

void observerPatterns_object_subscribe::update(const observerPatterns_msgPackage &opmp)
{
  _opmp = opmp;
  printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str());
}

#endif
#ifndef __observerPatterns_object_subscribe2_hpp__
#define __observerPatterns_object_subscribe2_hpp__

#include "observerPatterns_publish.hpp"
#include "observerPatterns_subscribe.hpp"

class observerPatterns_object_subscribe2 : public observerPatterns_subscribe
{
private:
  observerPatterns_msgPackage _opmp;
  observerPatterns_publish *_opb;
public:
  observerPatterns_object_subscribe2(observerPatterns_publish *opb);
  ~observerPatterns_object_subscribe2();
  void update(const observerPatterns_msgPackage &opmp);
};

observerPatterns_object_subscribe2::observerPatterns_object_subscribe2(observerPatterns_publish *opb)
  :_opb(opb)
{
  _opb->registerObjectSubscribe(this);
}

observerPatterns_object_subscribe2::~observerPatterns_object_subscribe2()
{
  _opb->removeObjectSubscribe(this);
}

void observerPatterns_object_subscribe2::update(const observerPatterns_msgPackage &opmp)
{
  _opmp = opmp;
  printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str());
}

#endif
  • 公共头文件
#ifndef __observerPatterns_common_hpp__
#define __observerPatterns_common_hpp__

#include <string>

struct observerPatterns_msgPackage
{
  std::string url;
  std::string msg;
};

typedef struct observerPatterns_msgPackage observerPatterns_msgPackage;

#endif
  • 主函数测试
/************************************************************************
  > File Name: observerPatterns_main.cpp
  > Author: 
  > Mail: 
  > Created Time: 
************************************************************************/

#include "observerPatterns_common.hpp"
#include "observerPatterns_object_publish.hpp"
#include "observerPatterns_object_subscribe.hpp"
#include "observerPatterns_object_subscribe2.hpp"

using namespace std;

int main(int argc, char *argv[])
{
  observerPatterns_object_publish *opop = new observerPatterns_object_publish;
  
  observerPatterns_msgPackage opmp1, opmp2;
  opmp1.url = "www.aaa.com";
  opmp1.msg = "Hello!";
  opmp2.url = "www.xyzxyz.com";
  opmp2.msg = "Hello, observerPatterns!";
  
  observerPatterns_object_subscribe *oposa = new observerPatterns_object_subscribe(opop);
  observerPatterns_object_subscribe *oposb = new observerPatterns_object_subscribe(opop);
  observerPatterns_object_subscribe2 *oposc = new observerPatterns_object_subscribe2(opop);
  observerPatterns_object_subscribe2 *oposd = new observerPatterns_object_subscribe2(opop);

  opop->setMsgPackage(opmp1);
  opop->setMsgPackage(opmp2);
  
  delete oposa;
  delete opop;
  return 0;
}

 懒汉模式懒汉模式在第一次用到类实例的时候才会去实例化,就是不到调用getInstance函数时,这个类的对象是一直不存在的。懒汉本身是线程不安全的。#include <iostrea ...