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中特质模式的定义相关推荐

  1. 蘑菇街Java工资_【蘑菇街工资】java系统架构师待遇-看准网

    面试官是个女生,hr打电话来两天后就开始电话面试了.自我介绍 :大三学生,学习了一年iOS,自己做了两个项目,天气和微博,swift和OC都写. 蘑菇街面经一面: 1,如何用实现微信两人之间发送消息? ...

  2. Java学习的30个目标以及系统架构师推荐的书

    第一阶段  你需要学习JAVA语言的基础知识以及它的核心类库 (collections,serialization,streams,networking, multithreading,reflect ...

  3. 系统架构师(java)和大数据架构师

    架构师不是一个职业工种,而是一种能力,而且架构师也分很多种,不同领域的架构师是不一样的.比如互联网架构师和物联网架构师,没有什么可对比的. 架构要考虑什么 1.考虑系统能做什么,不能做什么,就是常说的 ...

  4. 【备忘】JavaEE系统架构师学习路线图

    转载自:http://www.javaxxz.com/thread-286706-1-1.html 第1阶段(Java程序员) - Java语言基础     - 101 JavaSE:[101]JAV ...

  5. 最新JavaEE系统架构师学习路线之基础篇

    大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJAX.MySQL.SQ ...

  6. JavaEE系统架构师学习路线之基础篇

    大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJAX.MySQL.SQ ...

  7. JavaEE系统架构师学习路线(基础篇)

    大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJAX.MySQL.SQ ...

  8. 2019最新《JavaEE系统架构师学习路线之基础篇》

    下载地址:百度网盘 大纲: 第1阶段(Java程序员) - Java语言基础 第2阶段(Java初级软件工程师) - JSP.Servlet.HTML.CSS.JS.Bootstrap.XML.AJA ...

  9. JAVA EE架构师需要具备的知识

    JAVA EE架构师需要具备的知识 1.构架师胚胎(程序员):学习的知识是语言基础.设计基础.通信基础等,应该在大学完成,内容包括 java.c.c++.uml.RUP.XML.socket 通信(通 ...

最新文章

  1. xp用光盘安装linux系统安装教程视频,光盘重装xp系统图文教程
  2. MySQL-MMM实现MySQL高可用
  3. 隧道技术_隧道施工关于新防水工艺技术
  4. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据
  5. 基于struts2的登录系统
  6. 科学家研发机器人混入南极企鹅群 获“友好”对待
  7. vb.net中的-String类
  8. R-CNN(Rich feature hierarchies for accurate object detection and semantic segmentation)论文理解...
  9. 音视频技术开发周刊 | 160
  10. c++语言用文件输入数值,C++ 基本的输入输出
  11. 曾鸣:区块链中没有绝对的“去中心化”
  12. String 类实现 以及 流插入/流提取运算符重载
  13. 闪迪u盘量产工具U盘正常显示但是多出几个空分区的解决方案
  14. matlab车牌识别课程设计报告模板(附源代码)
  15. 内存管理基本原理及非ARC环境使用小心得
  16. [GUI] 图片背景是黑色的,在unity中怎么变成透明
  17. C numi和弓道 双指针(2020牛客寒假基础训练营1 )
  18. Speedoffice(word)如何调整页眉位置
  19. WORD如何取消默认的分栏
  20. 蓝蓝算法04-字符串逆置

热门文章

  1. CF536C-Tavas and Pashmaks【凸壳】
  2. P5748-集合划分计数【EGF,多项式exp】
  3. P5664-Emiya家今天的饭【dp】
  4. 传送门(最短路树+可并堆)
  5. MongoDb连接表的查询
  6. Spark入门(三)Idea构建spark项目
  7. MyBatis】MyBatis一级缓存和二级缓存
  8. Java集合面试问题
  9. Spring 注入内部 Beans
  10. springboot从控制器请求至页面时js失效的解决方法