关于Stack Overflow的 This热门回答有关于功能编程与面向对象编程之间的区别呢?

Object-oriented languages are good when you have a fixed set of
operations on things,and as your code evolves,you primarily add new
things. This can be accomplished by adding new classes which implement
existing methods,and the existing classes are left alone.

Functional languages are good when you have a fixed set of things,and
as your code evolves,you primarily add new operations on existing
things. This can be accomplished by adding new functions which compute
with existing data types,and the existing functions are left alone.

说我有一个动物界面:

public interface Animal {
    public void speak();
}

我有一只狗,猫,鱼和鸟,都实现了界面.如果我想为Animal命名为jump()添加一个新方法,我将不得不通过我的所有子类并实现jump().

访问者模式可以缓解这个问题,但似乎Java 8中引入了新的功能特性,我们应该能够以不同的方式解决这个问题.在scala中,我可以很容易地使用模式匹配,但Java并没有真正拥有.

Java 8实际上使现有的东西更容易添加新的操作吗?

解决方法

对Java语言的添加不会使每个旧概念过时.事实上,访客模式非常有利于支持新操作的添加.

当将此模式与新的Java 8可能性进行比较时,以下内容变得明显:

> Java 8允许轻松定义包含单个函数的操作.当处理像Iterable.forEach,Stream.forEach,Stream.reduce这样的平面均匀收藏时,这样就很方便
访客允许定义多个功能,这些功能是通过数据结构的元素类型和/或拓扑来选择的,当处理异构集合和非平面结构时,例如单个功能特征停止工作时变得有趣.物品树

因此,新的Java 8功能永远不会成为访问者模式的替代品,然而寻找可能的协同效应是合理的. This answer讨论了改进现有API(FileVisitor)以启用使用lambda表达式的可能性.该解决方案是一个专门的具体访问者实现,可以为每个访问方法指定相应的功能.如果每个函数是可选的(即每个访问方法都有一个合理的默认值),如果应用程序只对一小部分可能的操作感兴趣,或者如果想要对其中的大部分进行统一处理,它将会很方便.

如果这些用例中的某些被认为是“典型的”,则可能会有接受方法采取一个或多个功能,在场景后创建适当的委托访问者(在设计新的API或改进您的控制下的API时).不过,我不会放弃普通接受(XyzVisitor),因为使用访问者的现有实现的选项不能低估.

如果我们将Collector视为Stream的一个访问者,那么Stream API中也有类似的重载过载.它由多达四个功能组成,这是最大的想象力,可以访问一个平坦的,同质的项目序列.而不是必须实现该接口,您可以启动reduction specifying a single function或mutable reduction using three functions,但是通常情况下,specifying an existing implementation更简洁,例如collect(Collectors.toList())或collect(Collectors.joining(“,”))比通过lambda表达式/方法引用指定所有必要的函数.

当向访问者模式的特定应用程序添加此类支持时,它将使呼叫站点更加有光泽,而特定接受方法的实现站点始终是简单的.所以唯一仍然笨重的部分是访客类型本身;当增加支持基于功能接口的操作时,甚至可能会变得更加复杂.在不久的将来,不可能有一个基于语言的解决方案,更简单地创建这样的访问者或替代这个概念.

Java 8是否提供了访问者模式的替代方法?的更多相关文章

  1. Swift设计模式之访问者模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  2. 浅谈PHP面向对象之访问者模式+组合模式

    下面小编就为大家带来一篇浅谈PHP面向对象之访问者模式+组合模式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. java访问者模式的静态动态及伪动态分派彻底理解

    这篇文章主要为大家介绍了java访问者模式的静态动态及伪动态分派彻底理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. 轻松掌握php设计模式之访问者模式

    这篇文章主要帮助大家轻松掌握php设计模式之访问者模式,感兴趣的小伙伴们可以参考一下

  5. php – 访问者模式对动态类型语言有用吗?

    说明:在访问者模式中,可访问的类(实体)有一个方法.accept(),其作用是调用访问者的.visit()方法.我可以看到java示例的逻辑:访问者为它支持的每个可访问类型定义了一个不同的.visit方法,并且必须使用.accept()技巧在运行时选择它们.但是像python或PHP这样的语言有动态类型,没有方法重载.如果我是访问者,我可以在不知道实体的类型甚至方法的完整签名的情况下调用实体方法.(这是“双重调度”问题,对吧?

  6. Java 8是否提供了访问者模式的替代方法?

    关于StackOverflow的This热门回答有关于功能编程与面向对象编程之间的区别呢?

  7. ios – Objective-C中的访问者模式

    我不喜欢使用’isKindOfClass’或’isMemberOfClass’调用if/elseif/else块.它看起来很笨拙,不雅.另外,以这种方式实施访问者方法仍然值得吗?被访问的对象仍然可以忽视访问者,但还有其他方法可以实现.已经提出,代理或类集群可能更适合访问者模式的替代.我有兴趣看看你的想法!

  8. Java:使用RuntimeException从访问者转义

    是否有Java模式,我不知道实现这种非本地流控制?

  9. java – 为什么我们通过调用Acceptor.accept()而不是Visitor.visit()来启动Visitor?

    在Wikipediasample和GoF书中,访问者模式的使用是通过在某个接受者上调用accept方法来启动的.但为什么会这样呢?为什么我们不能开始使用所需的acceptor作为参数调用visit方法?我们仍然可以使访问者行为依赖于两种类型–访问者和接受者–并且我们可以消除冗余呼叫.这是用于说明这一点的示例代码:解决方法考虑:请注意,如果按照自己的方式执行,接受器的运行时类型将没有区别:将使用静态类型.通过执行双重调度,您可以确保使用两种运行时类型.

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部