Visitor模式和Observer观察者模式
所谓访问者模式,就是不同服务提供者对同一种服务提供的服务内容不同。
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观察者模式的更多相关文章
- NET设计模式 第二部分 行为型模式(18):观察者模式(Observer Pattern)
概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御 ...
- 设计模式18:Observer 观察者模式(行为型模式)
Observer 观察者模式(行为型模式) 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象) ...
- 完成C++不能做到的事 - Visitor模式
拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩 ...
- php模式设计之 观察者模式
这是我写的<php模式设计>的第五篇.前面的四篇在不断学习不断加深认识,到了今天再看观察者模式,觉得非常容易理解.这也许就是我们积少成多的结果吧.希望还是能够不断进步. 开篇还是从名字说起 ...
- Observer 观察者模式
简介 观察者模式(Observer),有时又被称为[发布]publish-[订阅]Subscribe模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式.在此种 ...
- 设计模式 ( 十七 ):Observer 观察者模式 -- 行为型
1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是 ...
- 委托、事件、Observer观察者模式的使用解析二
一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...
- Observer观察者模式与OCP开放-封闭原则
目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...
- 【转载】完成C++不能做到的事 - Visitor模式
原文: 完成C++不能做到的事 - Visitor模式 拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据 ...
随机推荐
- 《Java程序性能优化》之并发优化
第四章 并行程序优化 1.非阻塞同步避免了基于锁的同步的缺陷,无锁算法没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销.CAS算法:包含3个参数CAS(v,e,n).V表示要更新的变量,E表示 ...
- noip2016 天天爱跑步
没看过正解..应该是些乱七八糟想不出来的东西 解法1: 首先,必须要做的是将每条路径拆成2个直的路径 那么对于那条从深度大的到深度小的路径 dep[x]-dep[y]应该等于观察时间 那么就可以在这些 ...
- BZOJ1303 [CQOI2009]中位数图 其他
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1303 题意概括 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数 ...
- 6-3 矩阵链成 uva 442
较为简单的栈题 思路比较好 一次ac 1.char word :word=A:直接 a[word]=xxxx,不用 a[‘word’]=xxxx #include<bits/stdc++.h& ...
- laravel5 项目上线后务必将开发环境更改为生产环境
如果以开发环境上线,出错信息将全通过json暴露出来了,屏蔽方式如下: .env 文件设置如下APP_ENV=productionAPP_DEBUG=false 改完设置后把缓存清理一遍 如果更改后清 ...
- kms可用激活服务器地址|kms可用激活服务器分享
kms可用激活服务器地址|kms可用激活服务器分享 kms可用激活服务器地址都有哪些呢?使用kms激活服务器激活windows和office是微软提供的激活方式之一.kms激活服务器普遍由个人或企 ...
- Android应用开发-Activity
Android四大组件:Activity,Service,Broadcast Receiver,Content Provider Activity是Context的子类,同时实现了Window.Cal ...
- django-用户验证系统
django提供了一套用户验证系统,但是要使用这个系统,必须要使用django内置的用户模型:django.contrib.auth.models.User,这个模型中预先定义了一些字段,其中只有us ...
- Python3基础系列——枚举类型大揭秘
为什么使用枚举 枚举类型是定义常量的一种最优选择. 常量的广义概念是:不变化的量 对于常量的通俗比喻--如同大山不被轻而易举地改变 地球上的重力加速度到海枯石烂也会改变 人们使用的常量是时间不很漫长的 ...
- [POI2018]Pionek
[POI2018]Pionek 题目大意: 在无限大的二维平面的原点放置着一个棋子.你有\(n(n\le2\times10^5)\)条可用的移动指令,每条指令可以用一个二维整数向量表示.请你选取若干条 ...