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系统架构师有的特质