【发布时间】:2013-09-18 14:17:18
【问题描述】:
我正在阅读方法 Collections.synchronizedList() 的实现,并且对它是装饰器模式还是代理模式的示例感到困惑?
【问题讨论】:
标签: java design-patterns concurrency
我正在阅读方法 Collections.synchronizedList() 的实现,并且对它是装饰器模式还是代理模式的示例感到困惑?
【问题讨论】:
标签: java design-patterns concurrency
这绝对是一个装饰器。它使用相同接口的不同实现包装提供的列表,其方法会改变相同底层集合的行为(通过同步访问),同时将方法直接委托给包装的实例。
如果它是代理模式,则您不一定需要在构造期间传递要包装的集合,并且这些方法在幕后不一定会在每次调用时引用完全相同的集合实例。
【讨论】:
我正在阅读方法 Collections.synchronizedList() 的实现,并且对它是装饰器模式还是代理模式的示例感到困惑?
我同意@BalusC 的观点,它肯定是一个修饰器,它正在修改包装对象的功能。但我认为它也展示了代理模式的各个方面——至少我是如何使用这个术语的。
wikipedia page on the Proxy Pattern 作为其定义的一部分给出了“类作为其他事物的接口”。
在查看此definition of the proxy design pattern 时,作者将其定义为“为另一个对象提供代理或占位符以控制对其的访问。”
我认为这是 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 处理程序,我认为这是一种装饰形式。
【讨论】:
根据 URL https://docs.oracle.com/javase/tutorial/collections/implementations/wrapper.html,Collections.synchronizedList() 是装饰器模式的示例。
【讨论】: