所谓访问者模式,就是不同服务提供者对同一种服务提供的服务内容不同。

Typedef   std::vector<Ivisitable>   VisitbleArray;

Typedef  std::vector<IVisitor>  VisitorArray;

Interface  IVisitable

{

void      AcceptSum(IVisitor  visitor);

void      AcceptAvg(IVisitor  visitor);

void     CalcSum( IVisitor  visitor) ;

void    CalcAvg(IVisitor  visitor);

void    Attach(  Ivisitor  v);

void    Detach ( Ivisitor  v);

}

Typedef   std::vector<Ivisitable>   VisitbleArray;

Interface IVisitor

{

void         GetSum ( IVisitable  v);

void         GetAvg(IVisitable  v);

void  VisitSumCollection(VisitbleArray collection);

void  VisitAvgCollection(VisitbleArray collection);

}

Class   CVisitor1: public   IVisitor

{

void         GetSum ( IVisitable  v)

{

Printf(“ vistor1 invoke: \n”);

v. AcceptSum (this);

}

void      GetAvg(IVisitable  v)

{

Printf(“ vistor1 invoke: \n”);

v.AcceptAvg(this);

}

//在本方法中,我们实现了对Collection的元素的成功访问
  void   VisitSumCollection(VisitbleArray collection) {
     VisitbleArray::Iterator
it = collection.begin();
      while (it  !=
collection.end())

{
         it->AcceptSum(this);

It++;
      }

}

void   VisitAvgCollection(VisitbleArray collection) {
     VisitbleArray::Iterator
it = collection.begin();
      while (it  !=
collection.end())

{
         it->AcceptAvg(this);

It++;
      }

}

Class   CVisitor2: public   IVisitor

{

void         GetSum
( IVisitable  v)

{

Printf(“ vistor2 invoke: \n”);

v. AcceptSum
(this);

}

void      GetAvg(IVisitable  v)

{

Printf(“ vistor2 invoke: \n”);

v.AcceptAvg(this);

}

//在本方法中,我们实现了对Collection的元素的成功访问
  void   VisitSumCollection(VisitbleArray collection) {
     VisitbleArray::Iterator
it = collection.begin();
      while (it  !=
collection.end())

{
         it->AcceptSum(this);

It++;
      }

}

void   VisitAvgCollection(VisitbleArray collection) {
     VisitbleArray::Iterator
it = collection.begin();
      while (it  !=
collection.end())

{
         it->AcceptAvg(this);

It++;
      }

}

Class    CProduct1 : 
public   IVisitable

{

void      AcceptSum(IVisitor  visitor)

{

visitor->
GetSum(this);

}

void     
AcceptAvg(IVisitor  visitor)

{

Visitor->GetAvg(this);

}

void    
CalcSum( IVisitor  visitor)

{

Float  sum =0.0;

for(std::vector<float>::iterator 
it = m_Vec.begin(); m_vec.end();it++)

Sum += *it;

Printf(“ product1 calc  sum is
=%f\n”,sum);

}

void    
CalcAvg( IVisitor  visitor)

{

Float  sum =0.0,avg=0.0;

for(std::vector<float>::iterator 
it = m_Vec.begin(); m_vec.end();it++)

Sum += *it;

avg=sum/ m_Vec.size();

Printf(“ product1 calc  avg  is =%f\n”,avg);

}

private:

std::vector<float>  m_Vec;

}

Class    CProduct2 : 
public   IVisitable

{

void     
AcceptSum(IVisitor  visitor)

{

visitor->
GetSum(this);

}

void     
AcceptAvg(IVisitor  visitor)

{

Visitor->GetAvg(this);

}

void    
CalcSum( IVisitor  visitor)

{

Float  sum =0.0;

for(std::vector<float>::iterator 
it = m_Vec.begin(); m_vec.end();it++)

Sum += *it;

Printf(“ product2 calc  sum is
=%f\n”,sum);

}

void    
CalcAvg( IVisitor  visitor)

{

Float  sum =0.0,avg=0.0;

for(std::vector<float>::iterator 
it = m_Vec.begin(); m_vec.end();it++)

Sum += *it;

avg=sum/ m_Vec.size();

Printf(“ product2 calc  avg  is =%f\n”,avg);

}

private:

std::vector<float>  m_Vec;

}

所谓观察者式,就是不同种观察者希望提供一种服务。

Visitor模式和Observer观察者模式的更多相关文章

  1. NET设计模式 第二部分 行为型模式(18):观察者模式(Observer Pattern)

    概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御 ...

  2. 设计模式18:Observer 观察者模式(行为型模式)

    Observer 观察者模式(行为型模式) 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象) ...

  3. 完成C++不能做到的事 - Visitor模式

    拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩 ...

  4. php模式设计之 观察者模式

    这是我写的<php模式设计>的第五篇.前面的四篇在不断学习不断加深认识,到了今天再看观察者模式,觉得非常容易理解.这也许就是我们积少成多的结果吧.希望还是能够不断进步. 开篇还是从名字说起 ...

  5. Observer 观察者模式

    简介       观察者模式(Observer),有时又被称为[发布]publish-[订阅]Subscribe模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式.在此种 ...

  6. 设计模式 ( 十七 ):Observer 观察者模式 -- 行为型

    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是 ...

  7. 委托、事件、Observer观察者模式的使用解析二

    一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...

  8. Observer观察者模式与OCP开放-封闭原则

    目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...

  9. 【转载】完成C++不能做到的事 - Visitor模式

    原文: 完成C++不能做到的事 - Visitor模式 拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据 ...

随机推荐

  1. 天天爱跑步&&弹球

    题解: 弹球题目地址:https://www.nowcoder.com/acm/contest/113/E 后面这题 应该是天天爱跑步的加强版本 原理都是查询子树中dep[x]+f[x]的值的个数 由 ...

  2. Python全局解释器锁

    超过十年以上,没有比解释器全局锁(GIL)让Python新手和专家更有挫折感或者更有好奇心.    Python的底层 要理解GIL的含义,我们需要从Python的基础讲起.像C++这样的语言是编译型 ...

  3. 导出oracle序列

    set serveroutput on;spool c:\sequence_code.txt; declare  v_sequence varchar2(4000);  v_nextval numbe ...

  4. IE浏览器url中带中文报错的问题;以及各种兼容以及浏览器问题总结

    1.解决IE浏览器url带中文报错 /* encodeURI()解决IE浏览器请求url中带中文报错的问题 */ URL = encodeURI("<%=basePath%>ve ...

  5. 4.Django|ORM模型层

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  6. 002 Spark的编译

    一:不编译 1.不编译的做法 在公司里可能需要编译,但是如果为了简单的学习就不必编译,直接在官方下载即可. 截图为: 二:编译\ 1.下载 http://archive.cloudera.com/cd ...

  7. c++中关于用stringstream进行的类型转化

    1.将int转化成string类型 #include <iostream> #include <sstream> using namespace std; int main() ...

  8. NDK官方下载链接

    注:本文转载于成江海:<Android各个版本的NDK官方下载链接 > NDK官方网站:https://developer.android.google.cn/ndk/downloads/ ...

  9. WinForm中DataGridView导出为Excel(快速版)

    public static void ExportExcel(DataGridView myDGV, string fileName) { string saveFileName = fileName ...

  10. 洛谷.1333.瑞瑞的木棍(欧拉路径 Hash)

    题目链接 #include <cstdio> #include <cstring> const int N=2e6+5,M=5e5+5,mod=2e6; const int s ...