Collections.synchronizedList() 中使用了啥模式

Posted

技术标签:

【中文标题】Collections.synchronizedList() 中使用了啥模式【英文标题】:What pattern is used in Collections.synchronizedList()Collections.synchronizedList() 中使用了什么模式 【发布时间】:2013-09-18 14:17:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

另见:

Examples of GoF Design Patterns in Java's core libraries Decorator Pattern for IO

【讨论】:

使用代理修改被包装类的装饰器模式? @Gray:它绝对不是代理。代理的底层实例通常是“按需”创建的(通常是通过延迟加载)。如果您熟悉 EJB,您会更好地理解这部分内容。 我使用术语“代理”来表示接口的网络代理——更像是委托代理。这些不是“按需”,而是倾向于包装处理程序以提供 RPC 连接。感谢上帝,我没有使用 EJB 的经验。 :-) 就设计模式而言,AOP不就是代理模式装饰器模式的例子吗?我认为您对代理模式的定义可能需要扩展。 +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 处理程序,我认为这是一种装饰形式。

【讨论】:

正是我的困惑。但是在阅读了 Balus 的答案和更多在线资源之后,我认为它是一种装饰器模式。在代理中,大多数时候,真实对象对客户端是隐藏的,并且是在编译时创建的。另一方面,装饰器动态地为对象添加责任,客户端完全了解正在装饰的对象。看看这个链接:powerdream5.wordpress.com/2007/11/17/… 是的,我认为这是看待它的一种方式,但我不确定所有装饰器都是动态生成的。当然,我使用术语装饰器对象,我为我提供电线或为我提供弹簧线@ChanderShivdasani。【参考方案3】:

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

【讨论】:

以上是关于Collections.synchronizedList() 中使用了啥模式的主要内容,如果未能解决你的问题,请参考以下文章