Java中特质模式的定义

特质 在本文中,我将介绍特征的概念,并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例。 我将首先提出一个虚构的案例,其中可以使用特征来减少重复,然后以使用Java 8的特征模式示例实现为结尾。

假设您正在开发留言板软件,并且已将以下内容标识为数据模型:“主题”,“评论”和“附件”。 主题具有标题,内容和作者。 评论包含内容和作者。 附件有标题和斑点。 一个主题可以有多个评论和附件。 一个评论也可以有多个评论,但没有附件。

sYNIoqcYfpLJSRv3r4ygz8w

很快您就意识到,无论如何实现这三个模型,程序中都会有代码重复。 例如,如果您想编写一种向帖子添加新评论的方法,则需要编写一种用于评论主题的方法和一种用于评论评论的方法。 编写一种通过打印出讨论树来总结讨论的方法,必须考虑到节点可以是主题,评论或附件。

自Java于20年前问世以来,面向对象的编程一直是该语言的骨肉,但是在此期间,其他语言也尝试使用其他工具来组织程序的结构。 我们在Speedment Open Source中使用的一种这样的工具称为“特质”。 特性是一种“微接口”,它描述了类设计的某些特征,可以在整个系统的许多不同组件中找到它们。 通过引用特征而不是实现类本身,可以使系统保持解耦和模块化。

让我们看一下这将如何改变带有留言板的示例。

sgt3SF_AoeXL0Lo7YonS9HA

现在,每个实体的不同特征已分为不同的接口。 很好 由于Java允许我们每个类具有多个接口,因此在编写业务逻辑时可以直接引用这些接口。 实际上,完全不必公开这些类!

在其他编程语言(例如Scala,PHP,Groovy等)中存在很多特性。 据我所知,关于什么被视为不同语言之间的特征尚无共识。 在有关特征的Wikipedia页面上 ,它说:

“特质既提供了一组实现类行为的方法,又要求类实现了一组参数化所提供行为的方法”

以下特性被命名为特征特有的:

  • 特征可以组合(对称和)
  • 特质可以被覆盖(不对称总和)
  • 特质可以扩展(别名)
  • 特质可以排除(排除)

从Java 8开始,您实际上可以使用接口满足大多数这些条件。 例如,您可以使用满足对称和标准的and(&)运算符将未知类型的实现类强制转换为特征并集。 这里描述了一个很好的例子。 通过创建新接口并使用默认实现,您可以覆盖某些方法来满足不对称求和条件。 别名可以以类似方式创建。 唯一的问题是排除。 当前,java无法从继承中删除方法,因此无法防止子类访问特征中定义的方法。

如果返回到留言板示例,则可能需要一个示例,该示例要求实现类具有getComments方法,但是有关在注释上添加,删除和流式传输的所有其他逻辑都可以放在接口中。

public interface HasComments<R extends HasComments<R>> {// one method that parameterize the provided behaviourList<Comment> getComments();// two methods that implement the behaviourdefault R add(Comment comment) {getComments().add(comment);return (R) this;}default R remove(Comment comment) {getComments().remove(comment);return (R) this;}
}

如果我们有一个对象,并且想将其转换为HasComments和HasContent的对称和,则可以使用and(&)运算符来实现:

final Object obj = ...;
Optional.of(obj).map(o -> (HasComments<?> & HasContent<?>) o).ifPresent(sum -> {/* do something */});

这就是这一次!

PS:如果您想有关特质的概念,我真的建议您阅读N.Schärli等人于2003年发表的《 特征:行为的可组合单位》

翻译自: https://www.javacodegeeks.com/2016/02/definition-trait-pattern-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机 注册表 远程桌面,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...

计算机在开启远程桌面的时候选中了“仅允许运行使用网络级别身份验证的远程桌面计算机连接”&#xff0c;于是连接时提示错误如下&#xff1a;远程计算机需要网络级别身份验证&#xff0c;而您的计算机不支持该验证&#xff0c;请联系您的系统管理员或者技术人员来获得帮助解决…

前端笔记----定位

一.定位分三种&#xff1a;相对定位&#xff0c;绝对定位和固定定位。 1.相对定位&#xff1a;元素所占据的文档流的位置保留&#xff0c;元素本身相对自身原位置进行偏移&#xff1b; 如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

线程并发库和线程池的作用_并发–顺序线程和原始线程

线程并发库和线程池的作用不久前&#xff0c;我参与了一个项目&#xff0c;该项目的报告流程如下&#xff1a; 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新组合成最终报告&#xff0c;并返…

ipad2018编写html,IT教程:ipad6是ipad2018吗

科技就如同电灯发出的光一样&#xff0c;点亮我们的世界&#xff0c;点亮我们的生活&#xff0c;这一段时间以来ipad6是ipad2018吗的消息络绎不绝是什么原因呢?接下来就让我们一起了解一下吧。大家好&#xff0c;我是智能客服时间君&#xff0c;上述问题将由我为大家进行解答。…

流的多层次分组

1.简介 使用Java 8流&#xff0c;可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中&#xff0c;我们将看到如何从简单的单级分组到更复杂的&#xff0c;涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象&#xff1a;人和宠物。 人类 public cla…

冈仁波齐

昨日看了《冈仁波齐》&#xff0c;其实第一次听这部电影还是在网易云看到朴树的新歌《No Fear In My Heart》时知道有这样一部电影的&#xff1b; 抱着好奇心去看&#xff0c;发现这确实是一部不错的电影&#xff0c;具体好在哪里我也不是说得很清楚&#xff0c;只知道我在看电…

四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...

原标题&#xff1a;全网首发&#xff01;四川省本科二批次2019年对口高职投档录取线出炉四川省2019年高校招生本科录取接近尾声&#xff0c;二本批次征集志愿于8月1日进行。与此同时&#xff0c;专科批相关录取工作也进入我们视野。四川省各高校2019年对口高职调档线我省高职院…

app engine_App Engine中的Google Services身份验证,第1部分

app engine这篇文章将说明如何构建一个简单的Google App Engine&#xff08;GAE&#xff09;Java应用程序&#xff0c;该应用程序可以针对Google进行身份验证&#xff0c;并利用Google的OAuth授权访问Google的API服务&#xff08;例如Google Docs&#xff09;。 此外&#xff0…

Angular最新教程-第六节编写响应式导航栏

这节课我们讲解如何使用bootstrap 4 编写响应式布局。 参考图我们还是参照Angular中文社区http://www.angularjs.cn/ 图中标注红色的部分&#xff0c;我自己不是很喜欢&#xff0c;所以做了一点小改动。 他这里也没有做响应式布局&#xff0c;所以样式就不抄他的&#xff0c…

计算机在智慧交通的应用论文,智能交通的毕业论文

智能交通的毕业论文智能运输系统的研究许多国家都投入了巨大的人力和物力,并成为继航空航天、军事领域之后高新技术应用最集中的领域。下面为大家分享了有关智能交通的论文&#xff0c;欢迎欣赏&#xff01;摘 要&#xff1a;八十年代以来&#xff0c;世界一些发达国家纷纷投入…

MySQL5.5安装教程

1、 官网下载mysql5.5 下载地址&#xff1a; http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2、 安装mysql5.5 注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。 &#xff08;1&#xff09; 打开下载的mysql-5.5.53-winx64.msi &#xff08;2&#xff09; 点…

计算机上平方米的单位,word怎么写平方米 word中平方米的单位怎么打

1、以Word2010版本为例&#xff0c;在文档中输入了平方米的单位&#xff0c;但是数字2不在上方&#xff1b;2、首先选中数字2&#xff0c;然后点击页面上方的上标图标&#xff0c;如下图所示&#xff1b;3、点击上标图标后&#xff0c;就会发现数字2在字母的右上方了&#xff0…

SQL Server 索引重建手册

注意&#xff1a;索引重建前建议把数据库切换为完整模式&#xff0c;否则索引复制会在数据文件中进行&#xff0c;导致数据文件很大&#xff0c;而数据文件的收缩比日志文件的收缩要困难的多&#xff0c;且会对业务造成影响。步骤一:查询索引碎片&#xff0c;脚本如下&#xff…

apache camel_令人印象深刻的第一个Apache Camel版本

apache camel在准备下周的CamelOne会议时&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印…

notion自建服务器,【速报】Notion的特色「双向链接」方案来了,Synced Block 登场...

Notion 作为一款出色的「聚合型」(All-In-One)笔记 App&#xff0c;在这几年里逐渐获得了不少知识工作者的宠爱。在以前&#xff0c;大家一般会高度赞扬 Notion 的「模块化」编辑器&#xff0c;但同时也会好奇什么时候 Notion 可以带来像Roam Research 那样的 「双向链接」功能…

本周Java技巧#7 – Maven慢吗?

本周Java本周技巧是有关Maven的上一期的后续内容。 第一个视频介绍了与Maven依赖关系有关的方面。 该视频将介绍一些加快Maven构建速度的技术。 Maven慢吗&#xff1f; 从Maven 3开始&#xff0c;您可以并行运行构建。 根据构建机器和项目结构的不同&#xff0c;您可能会获得6…

华北电力大学的计算机类专业排名,2018年华北电力大学王牌专业排行榜,考生和家长们都好好看看!...

华北电力大学有两个校区&#xff0c;一个是北京校区&#xff0c;一个是保定校区&#xff0c;在理科类的院校中&#xff0c;这所大学还是非常不错的&#xff0c;小编有幸去这个学校玩过几次&#xff0c;这个学校的占地面积非常大&#xff0c;环境相对比较优美&#xff0c;而且学…

算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验

云服务器是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。通常来说&#xff0c;平台的每个集群节点被部署在互联网的骨干数据中心&#xff0c;可以独立提供计算、存储、在线备份、托管、带宽等互联网基础设施服务。关注的是高性能吞吐量计算能力&#xff0c;关注的是…

ajax后台怎么取mapp,后台管理实现

京淘后台管理实现1.1 商品列表展现1.1.1 商品POJO对象1.1.2 表格数据页面结构1.1.3 请求URL地址说明&#xff1a;如果采用UI框架并且添加了分页插件&#xff0c;则会自动的形成如下的URL请求地址1.1.4 编辑ItemController1.1.5 编辑ItemService1.1.6 编辑ItemMapper手动编辑分页…

让工厂美丽

每个名副其实的Java程序员都知道Factory Pattern 。 这是一种便捷&#xff0c;标准化的方法&#xff0c;它通过教一个组件如何捕鱼而不是将它们交给它们来减少耦合。 但是&#xff0c;在使用大型系统时&#xff0c;该模式确实会向系统添加大量样板代码。 对于每个实体&#xff…