C++实践::Template实现Observer模式

原创 2004年07月05日 08:32:00

难度:

C++ template实现的通用Observer代码。本文并无神秘之处,template只是运用在对状态信息类型的泛化。过多的细节就没必要不讲了,我想各位看官比我更明白吧

/*

Design Pattern implementation with C++ template - Observer

Author: Jinhao

Data: 5/Jul/2004

*/

#ifndef _OBSERVER_H_

#define _OBSERVER_H_

#include<vector>

 

template<typename Msg>

struct helper;

 

template<typename Msg>

struct subject;

 

template<typename Msg>

class observer

{

     friend class helper<Msg>;

protected:

     observer():psbj_(NULL)

     {}

public:    

     virtual ~observer()

{

         if(psbj_)

             psbj_->detach(*this);

}

    

     virtual void update(const Msg&)=0;

private:

     subject<Msg>* psbj_;

};

 

template<typename Msg>

class subject

{

     friend class helper<Msg>;

public:

     virtual ~subject()

     {

         typename std::vector<observer<Msg>*>::iterator begin = obsvrvec_.begin();

         typename std::vector<observer<Msg>*>::iterator end = obsvrvec_.end();

        

         for(; begin!=end; ++begin)

                   helper<Msg>::attachtosubject(NULL, *begin);

     }

     void attach(observer<Msg>& rhs) //register

     {

           obsvrvec_.push_back(&rhs);

           helper<Msg>::attachtosubject(this, &rhs);

     }

 

     void detach(observer<Msg>& rhs) //unregister

     {

         typename std::vector<observer<Msg>*>::iterator matched = find(obsvrvec_.begin(), obsvrvec_.end(), &rhs);

         if(matched != obsvrvec_.end())

             obsvrvec_.erase(matched);

     }

    

     void notify() //notify all observers

     {

         typename std::vector<observer<Msg>*>::iterator begin = obsvrvec_.begin();

         typename std::vector<observer<Msg>*>::iterator end = obsvrvec_.end();

        

         for(; begin!=end; ++begin)

              (*begin)->update(message_);

     }

    

protected:

     Msg& message()

        {   return message_; }

       

     const Msg& message() const

        {   return message_; }

       

     void message(const Msg& rhs)

        {  message_ = rhs; }

private:

     Msg message_;

     std::vector<observer<Msg>*> obsvrvec_;

};

 

template<typename Msg>

struct helper

{

   static void attachtosubject(subject<Msg>* sbj, observer<Msg>* obsv)

       {   obsv->psbj_ = sbj;  }  

};

#endif //_OBSERVER_H_

 

下面是应用的示例代码

class ConcreteObserver1:public observer<string>

{

public:

    void update(const string& message)

        {  cout<<message<<endl;  }

};

 

class ConcreteObserver2:public observer<string>

{

public:

    void update(const string& message)

    {

        copy(message.rbegin(), message.rend(), ostream_iterator<string::value_type>(cout));

        cout<<endl;

    }

};

 

class ConcreteSubject:public subject<string>

{

public:

     void set(const string& str)

        {  message(str); }

};

 

int main()

{

    ConcreteSubject subject;

    ConcreteObserver1 o1;

    ConcreteObserver2 o2;

    subject.attach(o1);

    subject.attach(o2);

    subject.set("show me the money");

    subject.notify();

}

我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)

概述:         最近中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑客户端上,网页上,手机上,iPad上都可以查看到该证券的实时行情,这种情况下我们...
  • LCL_data
  • LCL_data
  • 2013年06月30日 18:19
  • 29010

(C++实现)——模板方法模式(Template Method Pattern)

概述:      我们最近在开发一个支持多种压缩类型文件的解压缩且制作成pdf的一个应用。对我们的架构来说我们需要支持多种压缩文件类型,但却有固定的操作顺序(先解压缩,在读取里面的文件分析、制作...
  • u011676589
  • u011676589
  • 2013年09月18日 14:21
  • 1003

C++实现观察者(Observer)模式

http://www.ithao123.cn/content-5236710.html 观察者(Observer)模式,是常见的模式之一。比如一份报纸,有很多订户。订阅者并不知道报纸何时会送来,...
  • u010781856
  • u010781856
  • 2015年08月26日 20:45
  • 245

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权...
  • u012515223
  • u012515223
  • 2014年05月22日 14:37
  • 2908

Android 中的观察者模式Observer

Android 中的观察者模式 实现的简单框架。
  • feidu804677682
  • feidu804677682
  • 2014年12月26日 09:51
  • 10147

Observer 模式及JAVA内置的observer示例

关于观察者模式 假设今天您设计一个图形分析算表程序,当中有一个资料物件,您可以用表格图形物件、柱状图形物件、圆饼图形物件等方式来 呈现物件,无论您是用哪种图形物件,重点是若资料物件的内容作了更改,则图...
  • hu1020935219
  • hu1020935219
  • 2014年09月22日 12:42
  • 2307

设计模式拾荒之观察者模式( Observer Pattern ): MVC的进一步泛化

参考书籍: 《Design Patterns: Elements of Reusable Object-Oriented Software》 在商业项目中第一次读到观察者模式的代码是一个异步服务器消...
  • lengxiao1993
  • lengxiao1993
  • 2017年02月20日 14:43
  • 989

观察者模式(小程序实现)

观察者模式(通过继承Observable以及实现observer接口)简单实现,
  • zhangshoubin55
  • zhangshoubin55
  • 2016年12月06日 13:07
  • 336

javascript设计模式之Observer(观察者)模式

Observer(观察者)是一种设计模式,一个对象(subject)维持一系列依赖于它(观察者)的对象,将任何状态的任何变更自动通知给它们。 Suject(目标) 维护一系列的观察者,方便添加或者...
  • vuturn
  • vuturn
  • 2015年09月02日 10:49
  • 2685

设计模式——观察者模式(Observer)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记,欢迎交流。 ——Shulin 转载请注明出处:http://blog.csdn.net/zhsh...
  • u012909091
  • u012909091
  • 2014年08月20日 16:52
  • 2826
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++实践::Template实现Observer模式
举报原因:
原因补充:

(最多只允许输入30个字)