访客模式 无痕模式 区别

我猜想很多人都知道来访者设计模式,这在《四人帮的设计模式:可重用的面向对象软件的元素》一书中有描述。 模式本身不是很复杂(随着许多设计模式的发展):

我很久以来就认识来访者,但是我从来不需要它... Java本机处理多态:方法调用基于调用对象的运行时类型,而不是其编译类型。

interfaceAnimal{voideat();
}publicclassDogimplementsAnimal{publicvoideat(){System.out.println("Gnaws bones");}
}Animala=newDog();
a.eats();// Prints "Gnaws bones"

但是,这对于参数类型来说并不是很好( 完全):

publicclassFeeder{publicvoidfeed(Dogd){d.eat();}publicvoidfeed(Catc){c.eat();}
}Feederfeeder=newFeeder();
Objecto=newDog();
feeder.feed(o);// Cannot compile!

此问题称为双重调度,因为它需要调用基于实例和参数类型的方法,而Java本身无法处理该方法。 为了使其编译,需要以下代码:

if(oinstanceofDog){feeder.feed((Dog)o);
}elseif(oinstanceofCat){feeder.feed((Cat)o);
}else{thrownewRuntimeException("Invalid type");
}

使用更多可用的重载方法,这将变得更加复杂-并使用更多参数,则将成倍增加。 在维护阶段,添加更多重载方法需要读取if整体并进行更新。 多个参数是通过嵌入if来实现的,这在可维护性方面更加糟糕。 访客模式是一种完美的实现方式,无需if ,而以Animal类上的单个方法为代价。

publicinterfaceAnimal{voideat();voidaccept(Visitorv);
}publicclassCat{publicvoideat(){...}publicvoidaccept(Visitorv){v.visit(this);}
}publicclassDog{publicvoideat(){...}publicvoidaccept(Visitorv){v.visit(this);}
}publicclassFeederVisitor{publicvoidvisit(Catc){newFeeder().feed(c);}publicvoidvisit(Dogd){newFeeder().feed(d);}
}

优点:

  • 任何地方都没有评估逻辑
  • AnimalFeederVisitor之间的依从性仅限于visit()方法
  • 因此,当添加新的Animal子类型时, Feeder类型保持不变
  • 添加新的Animal子类型时, FeederVisitor类型可能会实现其他方法来处理它
  • 其他横切逻辑可能遵循相同的模式, 例如 ,训练动物新技巧的火车功能

举个简单的例子,花这么多篇幅似乎显得有些矫kill过正。 但是,我的经验告诉我,上述简单的东西注定会随着时间的流逝而变得越来越复杂。

翻译自: https://blog.frankel.ch/the-visitor-design-pattern/

访客模式 无痕模式 区别

访客模式 无痕模式 区别_访客设计模式相关推荐

  1. 访客模式 无痕模式 区别_模式:访客模式

    访客模式 无痕模式 区别 问候, 这周我们放开所有代数的内容,然后集中精力 面向对象编程的全部内容. Java声称支持OO,因此 为什么不使用它? 在本周的文章中,我们将讨论一下何时 以及为什么要应用 ...

  2. 访客模式 无痕模式 区别_旧访客设计模式的新生活

    访客模式 无痕模式 区别 介绍 访客 [1.2]是众所周知的经典设计模式. 有很多资源对其进行了详细说明. 在不深入研究实现的情况下,我将简要提醒一下该模式的概念,解释其优点和缺点,并提出一些可以使用 ...

  3. 访客模式 无痕模式 区别_访客设计模式示例

    访客模式 无痕模式 区别 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如 ...

  4. 访客模式 无痕模式 区别_行为设计模式:访客

    访客模式 无痕模式 区别 行为设计模式的最后一个模式将是访客模式. 当我们希望能够在不更改类的情况下为对象结构的类定义新操作时,使用访问者模式. 想象一下执行对api的http请求的软件的场景. 大多 ...

  5. 移动端浏览器隐私模式/无痕模式使用本地存储localStorage/sessionStorage的问题

    2019独角兽企业重金招聘Python工程师标准>>> 开发H5 webapp时经常需要使用本地存储,如localStorage和sessionStorage存储一些数据,相比最多能 ...

  6. 原型模式的应用场景_前端常用设计模式

    求关注 前端常见的设计模式主要有以下几种:1. 单例模式2. 工厂模式3. 策略模式4. 代理模式5. 观察者模式6. 模块模式7. 构造函数模式8. 混合模式 单例模式 这种设计模式的思想是确保一个 ...

  7. quirks 模式是什么?它和 standards 模式有什么区别_什么是二级分销模式

    现在的营销模式在逐渐的演变着,我们可以揣测到当今营销多样化的模式上阵,其效果各有不同,这也是网络发展到今天的产物.微信的发展,聚集了大量的用户,这也为商家提供了良好的机会,作为营销的主战场,更成为大家 ...

  8. python中代理模式分为几种_通俗 Python 设计模式——代理模式

    今天来说一说代理模式. 代理模式顾名思义,是对资源进行代理访问的一种模式,这里的资源是泛指在程序中会使用到的数据.操作.过程.对象等等.当然,针对不同的资源,代理进行的操作不尽相同,根据前人的总结,有 ...

  9. php在线客服系统源码_在线客服系统物流行业解决方案

    作为直接与客户接触的渠道,合力亿捷在线客服系统已经在许多领域得到了广泛运用,包括现在覆盖全国的现代物流.快递等业务.但许多企业在日常工作中容易遇见许多难题,也不清楚如何通过在线客服系统来解决物流行业的 ...

最新文章

  1. linux 天堂测试软件,[Ubuntu] HTTP Live Streaming 安装测试
  2. redis internal【转】
  3. 干货 | 深入浅出分销体系
  4. MongoDB存储文件之GridFS
  5. 利用Seafile搭建私有文件同步云盘
  6. linux学习查看日志命令
  7. springbatch导出mysql数据到外部文件
  8. chrome 发送请求出现:Provisional headers are shown 提示
  9. doc批量转成docx(doc batch convert docx)
  10. 北极科考:我们为什么要在北极呆上一年?
  11. React Native入门——布局实践:开发京东客户端首页(一)
  12. Netron 模型可视化神器,保存好的模型丢进去就能可视化!
  13. 对项目经理而言,PMP认证是否对职业生涯的发展有帮助?
  14. java创建不定长数组_java如何创建不定长的数组?
  15. 全志 H6 Orange Pi Lite 2 Android 7.0 蓝牙配置
  16. [转载]手机号码IP地址归属地查询
  17. 赛门铁克推测试版诺顿360服务 集成多种功能
  18. 指令mysql5.6卸载_Mysql5.6压缩包安装到windows 卸载命令
  19. win10笔记本玩游戏总是很卡怎么办
  20. 持续交付体系在高德的实践历程

热门文章

  1. 当我不再依赖你的时候说说_不会再依赖你的说说 以后不再依赖别人的说说
  2. 哈工大编译系统课程实验一词法分析报告
  3. Go语言实践[回顾]教程10--学习成绩统计的示例【中】
  4. ubuntu-16.04 详细安装教程(图文)附下载地址
  5. 2023年全国职业院校技能大赛(高职组)“软件测试”赛项竞赛赛项规程
  6. (六十一)线性模型:线性回归、岭回归和套索回归
  7. Redis持久化:RDB和AOF
  8. SecureCRT 命令
  9. 韶音OpenRun Pro和南卡Runner Pro3哪款更值得入手,看看对比测评
  10. C++网络通信之TCP数据包发送与接收