我正在阅读方法Collections.synchronizedList()的实现,并且不知道它是装饰模式还是代理模式的一个例子?
答案 0 :(得分:5)
绝对是装饰者。它将提供的列表包含在同一个接口的不同实现中,该接口的方法改变了同一个底层集合的行为(通过同步访问),同时将方法直接委托给包装的实例。
如果它是一个代理模式,你不一定需要在构造期间传递to-be-wrapped集合,并且这些方法在每次调用时都不一定引用完全相同的集合实例。
答案 1 :(得分:2)
我正在阅读方法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处理程序,我认为这是一种装饰形式。
答案 2 :(得分:1)
根据URL https://docs.oracle.com/javase/tutorial/collections/implementations/wrapper.html,Collections.synchronizedList()是装饰器模式的示例。