DCI(Data Context Interaction) 面向组合编程,一直是个比较高冷的概念。最近想实践下,发现了一篇不错的文章,翻译一下。
先介绍下背景:
JAVA语言是单继承的,所以实现“组合”总是比较绕的。总结下几种实现方式:
实现多接口,具体的行为和状态通过代理实现。
AOP/动态代理/其他字节码织入
JVM平台下的其他语言特性,例如scala的Trait,Ruby的mixin
特定框架Apache Zest
java8 对接口做了语法上的增强来模拟mixin. 但是不能很好的处理状态的继承。总的来说还是上面第一种方案类似。不过省去了很多代理方法的转发。
翻译:我把这个称为"虚拟字段模式"(Virtual Field Pattern),这些类提供了get,set方法,并最终合并到一起。像这样的带状态的混入,我也是刚有一些概要的想法,不知道有没有其他更官方的最佳实践,在我看来可以使用防御性方法实现代理:
interface Peeker<T { T peek(); T take(); // maybe some other methods... } interface PeekerView<T extends Peeker<T { Peeker<T getPeeker(); T peek() default { return getPeeker().peek(); } T take() default { return getPeeker().take(); } } public class BagOTricks<T implements PeekerView<T, ListView<T, SupplierView<T { private List<T underlying = ... private Peeker<T peeker = new ListPeeker<T(underlying); private Supplier<Optional<T supplier = new ListSupplier<T(underlying); @Override public Peeker<T getPeeker() { return peeker; } @Override public List<T getList() { return underlying; } @Override public Supplier<Optional<T getOptionalSupplier() { return supplier; } }
本文出自 “ThinkDifferently” 博客,转载请与作者联系!
java8 mixins “虚拟字段模式”实现“面向组合编程”
原文地址:http://martinfowlerfan.blog.51cto.com/1561330/1737984