java8 mixins “虚拟字段模式”实现“面向组合编程”

DCI(Data Context Interaction) 面向组合编程,一直是个比较高冷的概念。最近想实践下,发现了一篇不错的文章,翻译一下。

先介绍下背景:

JAVA语言是单继承的,所以实现“组合”总是比较绕的。总结下几种实现方式:

  1. 实现多接口,具体的行为和状态通过代理实现。

  2. AOP/动态代理/其他字节码织入

  3. JVM平台下的其他语言特性,例如scala的Trait,Ruby的mixin

  4. 特定框架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;
     }
 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章