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;
}
}
转载于:https://blog.51cto.com/martinfowlerfan/1737984