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

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. Oracle学习笔记--第2章 oracle 数据库体系结构

    第2章 oracle 数据库体系结构 目录: ————————————— 2.1物理存储结构 2.1.1数据文件 2.2.2控制文件 2.1.3重做日志文件 2.1.4其他文件 2.2逻辑存储结构 2 ...

  2. LINQ学习之旅 (四)

    LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains 1.Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. ...

  3. Spring AOP 入门实例详解

    目录 AOP概念 AOP核心概念 Spring对AOP的支持 基于Spring的AOP简单实现 基于Spring的AOP使用其他细节 AOP概念 AOP(Aspect Oriented Program ...

  4. openstack Too many open files错误

    oopenstack突然web页面无法打开,页面报500错误,查看httpd日志报如下错误 [Fri Feb ::] [:error] [pid ] [remote ] IOError: [Errno ...

  5. Ubuntu/Linux网络配置常用命令

    配置ip 打开配置文件 sudo vim /etc/network/interfaces # This file describes the network interfaces available ...

  6. 网络流24题 第五题 - PowerOJ1740 CodeVS1905 圆桌问题 二分图多重匹配 网络最大流

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - PowerOJ1740 - 有SPJ - 推荐 题目传送门 - CodeVS1905 - 无SPJ - 0% ...

  7. PTA 7-2 是否完全二叉搜索树(30 分) 二叉树

    将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...

  8. fmod()函数 (对浮点数取模)

    头文件:#include <math.h> fmod() 用来对浮点数进行取模(求余),其原型为:    double fmod (double x); 设返回值为 ret,那么 x = ...

  9. Ubuntu 开机自启动SSH+远程关机

    Ubuntu 开机自启动SSH+远程关机   安装SSH 如何通过ssh远程登录linux系统 开机自启动ssh sudo gedit /etc/rc.locl # 输入密码 # 添加下面命令于 ex ...

  10. BZOJ.5404.party(树链剖分 bitset Hall定理)

    题目链接 只有指向父节点的单向道路,所以c个人肯定在LCA处汇合.那么就成了有c条到LCA的路径,求最大的x,满足能从c条路径中各选出x个数,且它们不同. 先要维护一条路径的数的种类数,可以树剖+每条 ...