8

我正在阅读方法 Collections.synchronizedList() 的实现,并且很困惑它是装饰器模式还是代理模式的示例?

4

3 回答 3

8

这绝对是一个装饰器。它使用相同接口的不同实现包装提供的列表,其方法会改变相同底层集合的行为(通过同步访问),同时将方法直接委托给包装的实例。

如果它是代理模式,则您不一定需要在构造期间传递要包装的集合,并且这些方法在幕后不一定会在每次调用时引用完全相同的集合实例。

也可以看看:

于 2013-09-13T19:46:14.930 回答
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);
}

在这个答案中,代理、装饰器、适配器和桥接模式有何不同?,作者将装饰器定义为我认为听起来正确的“智能代理”模式。然后是面向方面的编程和其他类似的模式使用“代理”和“装饰”来解释它们是如何工作的。

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

于 2013-09-13T20:16:24.440 回答
1

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

于 2017-06-29T19:18:11.163 回答