Collections.synchronizedList()中使用了什么模式

时间:2013-09-13 19:41:10

标签: java design-patterns concurrency

我正在阅读方法Collections.synchronizedList()的实现,并且不知道它是装饰模式还是代理模式的一个例子?

3 个答案:

答案 0 :(得分:5)

绝对是装饰者。它将提供的列表包含在同一个接口的不同实现中,该接口的方法改变了同一个底层集合的行为(通过同步访问),同时将方法直接委托给包装的实例。

如果它是一个代理模式,你不一定需要在构造期间传递to-be-wrapped集合,并且这些方法在每次调用时都不一定引用完全相同的集合实例。

另见:

答案 1 :(得分:2)

  

我正在阅读方法Collections.synchronizedList()的实现,并且不知道它是装饰模式还是代理模式的一个例子?

我同意@BalusC,它肯定是一个装饰器,它正在修改包装对象的功能。但我认为它也证明了代理模式的各个方面 - 至少我如何使用这个术语。

我认为这是Collections.synchronizedList()包装器代码通过调用委托来执行的操作:

public E get(int index) {
    return list.get(index);}
public E set(int index, E element) {
    throw new UnsupportedOperationException();
}
public void add(int index, E element) {
    throw new UnsupportedOperationException();
}
public int indexOf(Object o) {
    return list.indexOf(o);
}

在这个答案中,How do the Proxy, Decorator, Adapter, and Bridge Patterns differ?,作者将装饰器定义为“智能代理”模式,我认为这听起来是正确的。然后有Aspect Oriented Programming和其他类似的模式使用“代理”和“装饰”来解释它们是如何工作的。

当然,在支持底层对象的方法和功能时,存在延迟加载或稀疏的代理模式。有一些代理模式可以将对象的某些部分远程连接到RPC处理程序,我认为这是一种装饰形式。

答案 2 :(得分:1)

根据URL https://docs.oracle.com/javase/tutorial/collections/implementations/wrapper.html,Collections.synchronizedList()是装饰器模式的示例。