java系统架构师有的特质_Java中特质模式的定义
java系统架构师有的特质
在本文中,我将介绍特征的概念,并为您提供一个具体示例,说明如何在Java中使用它们以减少对象设计中的冗余。 我将首先提出一个虚构的案例,其中可以使用特征来减少重复,然后以使用Java 8的特征模式示例实现为结尾。
假设您正在开发留言板软件,并且已将以下内容标识为数据模型:“主题”,“评论”和“附件”。 主题具有标题,内容和作者。 评论包含内容和作者。 附件有标题和斑点。 一个主题可以有多个评论和附件。 一个评论也可以有多个评论,但没有附件。
很快,您意识到无论您如何实现这三个模型,程序中都会有代码重复。 例如,如果您想编写一种在帖子中添加新评论的方法,则需要编写一种用于评论主题的方法和一种用于评论评论的方法。 编写一种通过打印出讨论树来总结讨论的方法时,必须考虑到节点可以是主题,评论或附件。
自Java于20年前问世以来,面向对象的编程一直是该语言的骨肉,但是在此期间,其他语言也尝试使用其他工具来组织程序的结构。 我们在Speedment Open Source中使用的一种这样的工具称为“特质”。 特性是一种“微接口”,它描述了类设计的某些特征,可以在整个系统的许多不同组件中找到它们。 通过引用特征而不是实现类本身,可以使系统保持解耦和模块化。
让我们看一下这将如何改变留言板的示例。
现在,每个实体的不同特征已分为不同的接口。 很好 由于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
java系统架构师有的特质
java系统架构师有的特质_Java中特质模式的定义相关推荐
- 蘑菇街Java工资_【蘑菇街工资】java系统架构师待遇-看准网
面试官是个女生,hr打电话来两天后就开始电话面试了.自我介绍 :大三学生,学习了一年iOS,自己做了两个项目,天气和微博,swift和OC都写. 蘑菇街面经一面: 1,如何用实现微信两人之间发送消息? ...
- Java学习的30个目标以及系统架构师推荐的书
第一阶段 你需要学习JAVA语言的基础知识以及它的核心类库 (collections,serialization,streams,networking, multithreading,reflect ...
- 系统架构师(java)和大数据架构师
架构师不是一个职业工种,而是一种能力,而且架构师也分很多种,不同领域的架构师是不一样的.比如互联网架构师和物联网架构师,没有什么可对比的. 架构要考虑什么 1.考虑系统能做什么,不能做什么,就是常说的 ...
- 【备忘】JavaEE系统架构师学习路线图
转载自:http://www.javaxxz.com/thread-286706-1-1.html 第1阶段(Java程序员) - Java语言基础 - 101 JavaSE:[101]JAV ...
- 最新JavaEE系统架构师学习路线之基础篇
大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJAX.MySQL.SQ ...
- JavaEE系统架构师学习路线之基础篇
大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJAX.MySQL.SQ ...
- JavaEE系统架构师学习路线(基础篇)
大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJAX.MySQL.SQ ...
- 2019最新《JavaEE系统架构师学习路线之基础篇》
下载地址:百度网盘 大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJA ...
- JAVA EE架构师需要具备的知识
JAVA EE架构师需要具备的知识 1.构架师胚胎(程序员):学习的知识是语言基础.设计基础.通信基础等,应该在大学完成,内容包括 java.c.c++.uml.RUP.XML.socket 通信(通 ...
最新文章
- xp用光盘安装linux系统安装教程视频,光盘重装xp系统图文教程
- MySQL-MMM实现MySQL高可用
- 隧道技术_隧道施工关于新防水工艺技术
- 使用asp.net 2.0中的SqlBulkCopy类批量复制数据
- 基于struts2的登录系统
- 科学家研发机器人混入南极企鹅群 获“友好”对待
- vb.net中的-String类
- R-CNN(Rich feature hierarchies for accurate object detection and semantic segmentation)论文理解...
- 音视频技术开发周刊 | 160
- c++语言用文件输入数值,C++ 基本的输入输出
- 曾鸣:区块链中没有绝对的“去中心化”
- String 类实现 以及 流插入/流提取运算符重载
- 闪迪u盘量产工具U盘正常显示但是多出几个空分区的解决方案
- matlab车牌识别课程设计报告模板(附源代码)
- 内存管理基本原理及非ARC环境使用小心得
- [GUI] 图片背景是黑色的,在unity中怎么变成透明
- C numi和弓道 双指针(2020牛客寒假基础训练营1 )
- Speedoffice(word)如何调整页眉位置
- WORD如何取消默认的分栏
- 蓝蓝算法04-字符串逆置