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; } }