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

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. TOP排行新闻列表。

    效果图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  2. Asp.Net构架(Http请求处理流程)、(Http Handler 介绍)、(HttpModule 介绍)

    Asp.Net构架(Http请求处理流程) Http请求处理流程概述 对于普通访问者来说,这就像每天太阳东边升起西边落下一样是理所当然的:对于很多程序员来说,认为这个与己无关,不过是系统管理员或者网管 ...

  3. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  4. NodeJS学习:搭建私有NPM

    工具 verdaccio nrm pm2 特点 verdaccio 的特点: 不同步拉取npm库,占据大量硬盘,没有硬盘被撑爆的问题: 安装配置极其简单,不需要数据库: 支持配置上游registry配 ...

  5. [HNOI2010]CITY 城市建设

    问题: 给一张图,支持边长度修改,求MST 题解: 自己想就想不到了.. 考虑cdq分治 1.首先求出一定有用的边 对于未处理的边,全部设为-INF,求一次MST,出现在MST上的边一定最终出现在后面 ...

  6. java导出数据EXCEL的工具类(以spring-webmvc-4.0.4jar为基础)

    1.本工具类继承于  spring-webmvc-4.0.4jar文件心中的一个类   AbstractExcelView 2.代码如下 package com.skjd.util; import j ...

  7. Repository HDU2846

    极限过的 最原始的方法一层一层建树就好了 #include<bits/stdc++.h> using namespace std; ][]={}; ]={}; ]; ; int pos; ...

  8. poj2184 Cow Exhibition【01背包】+【负数处理】+(求两个变量的和最大)

    题目链接:https://vjudge.net/contest/103424#problem/G 题目大意: 给出N头牛,每头牛都有智力值和幽默感,然后,这个题目最奇葩的地方是,它们居然可以是负数!! ...

  9. hdu 1251:统计难题[【trie树】||【map】

    <题目链接> 统计难题                        Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131 ...

  10. Hash值破解工具Hashcat使用

    Hash值破解工具Hashcat使用 Hashcat介绍 HashCat系列软件拥有十分灵活的破解方式,可以满足绝大多数的破解需求. Hashcat系列软件是比较牛逼的密码破解软件,系列软件包含Has ...