【行为型】Visitor模式】的更多相关文章

拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩下的两三天里,我就可以有一些空余的时间看看其它资料来继续充实自己了. 打开Review Board,可以看到我的代码已经被标记为可以提交,但是下面所留的注解引起了我的注意: “Great job! With this solution, we can start our integration wo…
Modem结构 Visitor模式 对于被访问(Modem)层次结构中的每一个派生类,访问者(Visitor)层次中都有一个对应的方法. 从派生类到方法的90度旋转. 新增类似的Windows配置函数时,Visitor模式使用Visitor派生类来代替了被访问者结构中的方法. 双重分发:accept()+visit()两个动态分发. 形成了一个功能矩阵:不同类型的Modem的轴线+不同OS的轴线.每一个单一都被一个功能(描绘了特定的Modem在特定的OS中使用的)填充. Acyclic Visi…
设计模式,现在在网上随便搜都一大堆,为什么我还要写"设计模式"的章节呢? 两个原因: 1.本人觉得这是一个有趣的设计模式使用实例,所以记下来: 2.看着设计模式很牛逼,却不知道怎么在实战中应用出来.希望这个实例能给学习者一个参考,一点启发. 注意:本文是个人对设计模式的见解,不会出现大家常见的设计模式的概念.此文只作为一个实例.建议初学者参杂着别人博文一起读. 在此,向<大话设计模式>作者吴强前辈致敬 一. Visitor(访问者)模式 关键词:访问者, 被访问者(元素),…
1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基于线程池的实现并发Visitor模式. 二,讨论下并发场景下的一些细节处理. 三,用模拟数据测试并做补充说明. 2.背景 当从网站的某个页面进入购物车时,服务端需要做各种数据处理,比如刷新商品价格,计算促销价.校验库存等等.这些操作会随着业务的增加不断扩展,那么Visitor模式就适合这种场景,这也…
最近读到Visitor模式,还是一知半解的.偶然翻到Uncle Bob对该模式的推导过程,有所心得,和大家分享一下. Uncle Bob 的链接是: http://butunclebob.com/ArticleS.UncleBob.VisitorVersusInstanceOf.个人觉得该模式用来操作复杂对象集合,特别适用于报表生成.因为报表的来源相对稳定(复杂数据集合),但是表现形式却是千变万化.言归正传,我将该博客的内容按照自己的理解分享出来,如果有什么不对的地方,请指正. 首先有一个如下简…
双重分发(Double Dispatch) 什么是双重分发? 谈起面向对象的程序设计时,常说起的面向对象的「多态」,其中关于多态,经常有一个说法是「父类引用指向子类对象」. 这种父类的引用指向子类对象的写法类似下面这种: Animal animal = new Dog(); animal.bark(); 另一种常用的形式是 public class Keeper { public void say(Animal a) { System.out.println("Animal say")…
原文: 完成C++不能做到的事 - Visitor模式 拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩下的两三天里,我就可以有一些空余的时间看看其它资料来继续充实自己了. 打开Review Board,可以看到我的代码已经被标记为可以提交,但是下面所留的注解引起了我的注意: “Great job! With this solution, we…
visitor模式,又叫访问者模式,把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类.这样,当需要增加新的处理时候,只需要编写新的 访问者类,让数据结构可以接受访问者的访问即可. 本次,我们以电脑装机为例.需求是,想组装一台电脑,有三个硬件,显卡,CPU和硬盘,想装进电脑主机箱里面,只能采取接口的方式.首先我们假设使用的是usb接口去连接. 下面是具体的代码:因为要表现出接口可换的概念,我采用的是将电脑硬件和电脑本身的类以及接口的interface接…
Visitor ? 在Visitor模式中,数据结构与处理被分离开来.我们编写一个表示"访问者"的类来访问数据结构中的元素, 并把对各元素的处理交给访问者类.这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让 数据结构可以接受访问者的访问即可. ** 概括: 数据结构与处理彼此分开,当需要实现新数据访问方式的时候,实现Visitor就行了,(缺点:如果增加元素的访问那会非常麻烦) 理清职责 作用:这里用到Composition设计模式的那个文件和文件夹的例子作为访问者要访问的…
1.意图 表示一个作用于某对象结构中的各元素的操作.它使你能够在不改变各元素的类的前提下定义作用于这些元素的新操作. 2.别名 无 3.动机 考虑一个编译器.他将源程序表示为一个抽象语法树.该编译器须要在抽象语法上实施某些操作以进行"静态语义"分析,比如检查是否全部的变量都已经被定义了. 他也须要生成代码.由于它可能要定义很多操作以进行代码检查.代码优化.流程分析.检查变量是否在使用前被赋初值.等等.此外.还可使用抽象语法树进行优美格式打印.程序重构.code instrumentat…
Visitor模式可以用来把数据结构与处理分离开.通俗来说就是编写一个访问者类来访问数据结构中的元素,并把对各元素的处理交给访问者类.这样,当需要增加新的处理时,只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可. 下面先看示例程序的类图. 在示例程序中,使用Composite模式中用到了那个文件和文件夹的例子作为访问者要访问的数据结构.访问者会访问由文件和文件夹构成的数据结构,然后显示出文件和文件夹的一览. package bigjunoba.bjtu.visitor; public…
目录 1. Visitor模式简介 2. 示例 2.1 类图 2.2 代码 3. 模式的角色和类图 4. 思路拓展 4.1 双重分发 4.2 开闭原则 4.3 难以增加ConcreteElement角色 4.4 Visitor工作所需的条件 1. Visitor模式简介 ​ Visitor是访问者的意思. ​ 一个数据结构包含多种数据元素,这些数据元素方便存储,却不一定方便使用.因此我们有必要架起一座桥梁,即对数据元素进行处理,方便别人使用.问题来了:数据的处理是放在数据结构类里面还是再造一个类…
写在前面 Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大.使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时应该使用这个模式及这个模式是怎么一点点演讲出来的提之甚少,造成很多人对这个模式有种雾里看花的感觉,今天跟着老胡,我们一起来一点点揭开它的面纱吧. 模式演进 举个例子 现在假设我们有一个简单的需求,需要统计出一篇文档中的字数.词数和图片数量.其中字数和词数存在于段落中,图片数量单独统计.于是乎,我们可…
访问者模式意图在不改变目标对象类结构的情况下,扩展对象类的行为.新扩展的行为均被封装成类对象的形式来动作.应用该模式时,往往目标类系与Visitor类系是两个不同的类系,它们配合工作但维护是分开的,互不影响.每次扩展一个新行为时,需要新增加一个Visitor派生类.而目标类系只需要接受Visitor对象即可.模式的类关系图参考如下: 模式编码结构参考如下: namespace visitor { class Target; class IVisitor { public: // some cod…
模式的定义与特点 访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式.它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式.访问者(Visitor)模式是一种对象行为型模式,其主要优点如下. 扩展性好.能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能. 复用性好.可以通过访问者来定义整个对象结构通用的功能,从而提高系统…
The pragmatic programmers 一直在工作之余读些书,之前主要是纯英文版的计算机相关的算法,编译器,数学等,想通过读这些书来提高自己每日工作效能,结果收效甚微.一是,因为纯英文的书,阅读的慢,第二,也是最重要的一点,发现掌握的很慢,思前想后感觉可能是和工作的内容距离较远,两者不能互相辅助,第三,不能直接的回馈工作本身. 索性就换一换类型,最先入手的,是<agile software development-principles, patterns, and practices…
无环的访问者模式,是来改进原有访问者模式的不足之处的,是Robert C. Martin首次提出的.我们知道访问者模式的优点是为被访问继承体系动态添加行为,而无须改变继承体系.但是GOF访问者模式的缺点是形成了一个循环依赖,强烈的耦合了两个继承体系,使得我们修改任何一方都会对另一方造成影响,所以GOF提出,被访问者的继承体系必须是稳定的,否则,一旦被访问的继承体系修改了,两边都要改. GOF访问者模式的UML类图.从图中可以看到循环依赖,一旦被访者体系发生变化,则访问者体系就要修改,这是难以接受…
命令模式的定义 命令模式属于对象的行为型模式.命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开.命令模式的实现可以提供命令的撤销和恢复功能. Receive接收者角色           该角色就是干活的角色,命令传递到这里是应该被执行的.  Command命令角色           需要执行的所有命令都这里声明.  Invoker调用这角色           接收到命令,并执行命令.   具体命令模式的实现代码如下所示: names…
所谓访问者模式,就是不同服务提供者对同一种服务提供的服务内容不同. Typedef   std::vector<Ivisitable>   VisitbleArray; Typedef  std::vector<IVisitor>  VisitorArray; Interface  IVisitable { void      AcceptSum(IVisitor  visitor); void      AcceptAvg(IVisitor  visitor); void    …
装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇.在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.排气扇并无直接关系,一个开关在安装之后可能用来控制电灯,也可能用来控制排气扇或者其他电器设备.开关与电器之间通过电线建立连接,如果开关打开,则电线通电,电器工作:反之,开关关闭,电线断电,电器停止工作.相同的开关可以通过不同的电线来控制不同的电器,如图1所示: 图1 开关与电灯.排气扇示意图 在图1中,我们可以将开关理解…
访问者模式是对象的行为模式.访问者模式的目的是封装施加在某种数据结构元素上的操作.一旦一些操作需要修改,接受这个操作的数据结构可以保持不变. 个人觉得访问者模式相对其他的设计模式来说稍微复杂,难理解一点,要理解这个模式首先需要了解"单分派与多分派". 单分派与多分派 根据对象的类型对执行方法进行选择,就是分派(Dispatch).分派是面向对象语言提供的关键特性之一,根据分派发生的时期,可分为两种,静态分派和动态分派.静态分派发生在编译时期,动态分派发生在执行时期. 重载方法的分派是根…
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/L_Andy/article/details/36896645 一. 訪问者模式 定义:表示一个作用于某对象结构中的各元素的操作. 它你能够在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构例如以下: 二. 举例 如果有一项科学实验,是用来对照两种种子在不同环境下的生长情况. 两种种子.一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B). 生长环境,各自是在多雨环境下(…
一句话 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 概括…
weblogic Server 12.1.1全部都可以用原来方式. WebLogic Server 12.1.2后已经取消了console安装模式,目前只有gui和静默安装模式.并且安装方式下也有很大变化 如果静默安装模式,需要创建一个response file,内容如下: [ENGINE] #DO NOT CHANGE THIS. Response File Version=1.0.0.0.0 [GENERIC] #The oracle home location. This can be a…
訪问者模式:表示一个作用于某个对象结构中的各元素操作.它使你能够不改变各元素的类的前提下定义作用于这些元素的新操作. 首先定义一个visitor抽象类,为每一个详细类声明一个visit操作 public abstract class Visitor { public abstract void visitConcreteElementA(ConcreteElementA elementA); public abstract void visitConcreteElementB(ConcreteE…
当做一件事失败了,要告诉他 暂未成功,暂时没有成功,继续努力,下次就有可能成功. 不及格,暂未及格  是两种思维模式,成长性的思维方式得到的是一个是努力型的人格…
简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实现添加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍另外一种工厂模式--工厂方法模式. 1 日志记录器的设计 Sunny软件公司欲开发一个系统执行日志记录器(Logger).该记录器能够通过多种途径保存系统的执行日志,如通过文件记录或数据库记录,用户能够通过改动配置文件灵活地更换日志记录方式. 在设…
一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环境下的生长情况. 两种种子,一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B). 生长环境,分别是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等. 结构如下: 代码如下: //状态 class Status { public: virtual ~S…
1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储为doc.docx.pdf.txt等格式,但是通过word的另存为功能转变文档的存储格式时都采用了“文件 --> 另存为”,相同的创建过程.当需要对word支持新的类型转换时,例如,添加*.newtype类型的转换,此时只需在“另存为”对话框的“选择存储类型”中添加一行"*.newtype&q…
状态者模式的介绍 每个对象都有其对应的状态,而每个状态又对应一些相应的行为,如果某个对象有多个状态时,那么就会对应很多的行为.那么对这些状态的判断和根据状态完成的行为,就会导致多重条件语句,并且如果添加一种新的状态时,需要更改之前现有的代码.这样的设计显然违背了开闭原则.状态模式正是用来解决这样的问题的.状态模式将每种状态对应的行为抽象出来成为单独新的对象,这样状态的变化不再依赖于对象内部的行为. 状态者模式的定义 上面对状态模式做了一个简单的介绍,这里给出状态模式的定义. 状态模式——允许一个…