ForwardingList(后者
extendsForwardingCollection又
extendsForwardingObject实现了修饰符模式)。
要使用它,您只需要做两件事:
@Override delegate()
返回方法转发到的支持委托实例@Override``List
您想要/需要装饰的任何方法
装饰器模式允许您使用合成而不是继承( Effective Java 2nd Edition,通过继承实现Favor合成
),并且
ForwardingListGuava提供了一个方便的模板来编写您自己的
List实现,从而为您提供所有管道机制。
请注意,如果您打算装饰
ArrayList,则可能希望
ForwardingList子类也实现
RandomAccess。
例: ListWithDefault
这是一个(不完整!)示例,该示例使用给定的默认值
ForwardingList替换
null委托中的值。
import java.util.*;import com.google.common.collect.*;public class ListWithDefault<E> extends ForwardingList<E> { final E defaultValue; final List<E> delegate; ListWithDefault(List<E> delegate, E defaultValue) { this.delegate = delegate; this.defaultValue = defaultValue; } @Override protected List delegate() { return delegate; } @Override public E get(int index) { E v = super.get(index); return (v == null ? defaultValue : v); } @Override public Iterator<E> iterator() { final Iterator<E> iter = super.iterator(); return new ForwardingIterator<E>() { @Override protected Iterator<E> delegate() { return iter; } @Override public E next() { E v = super.next(); return (v == null ? defaultValue : v); } }; }}然后我们可以如下进行测试:
public static void main(String[] args) { List<String> names = new ListWithDefault<String>( Arrays.asList("Alice", null, "Bob", "Carol", null), "UNKNOWN" ); for (String name : names) { System.out.println(name); } // Alice // UNKNOWN // Bob // Carol // UNKNOWN System.out.println(names); // [Alice, null, Bob, Carol, null]}请注意,这是 _不完整的_实现。该
toString()方法仍然返回委托的
toString(),它不知道默认值。
@Override为了实现更完整的实现,还必须使用其他一些方法。



