【问题标题】:Proxy pattern concrete class hiding implementation details代理模式具体类隐藏实现细节
【发布时间】:2016-04-08 14:55:55
【问题描述】:

我一直在阅读有关 java 代理模式和调用处理程序的内容,并且到处都可以看到具体的类构造可供客户端使用。

例如,

//TwitterService service = (TwitterService) SecurityProxy.newInstance(new TwitterStub());
TwitterService service = new TwitterStub();
System.out.println(service.getTimelinePosts("abc"));

用户可以直接创建TwitterStub 的实例并访问这些方法。我想知道是否有办法不暴露或避免通过客户端构建具体类?

有没有更好的办法?

【问题讨论】:

  • 你需要提供一个InvocationHandler的实现,其他什么都不需要。
  • 你可以使用Factory Method Pattern或者Abstract Factory Pattern来隐藏你的构造函数的直接调用。
  • 但我觉得我不太明白你的问题...
  • 任何依赖注入机制似乎都可以回答这个问题。

标签: java design-patterns proxy-pattern


【解决方案1】:

正如 GoF 所说,代理模式的目的是“为另一个对象提供代理或占位符以控制对其的访问”。

因此,在您的具体情况下,您会直接创建一个特定的代理实例。只要您(作为客户)知道您想要一种特定类型的代理对象,那就没问题了。

如果您想要的是间接级别,您可以使用返回不同类型代理对象的抽象工厂模式。但是到目前为止,代理对象的原因是代表其他对象行事。

附带说明,当您拥有创建成本高昂的对象时,代理很有用,但您不希望由于此类费用而必然削弱主应用程序功能。例如,假设您有一个包含 1000 个图像的文档。您可以为它们使用代理,并且仅在非常需要时(即它们在可见视图中时)才加载它们,并且您仍然可以非常快速地加载整个文档,而无需一次读取 1000 张图像的开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2016-10-30
    相关资源
    最近更新 更多