1

我正在实施一个有两个面孔的服务?该服务提供了供用户应用程序使用的各种方法。该服务可以是公共/私人服务。它可能是操作系统服务或网络服务或内存。我想要一张用于一般类型的用户应用程序的面孔和另一张用于特殊类型的用户应用程序的面孔。一般用户应用程序将无法看到为特殊应用程序提供的方法。两者都有一些常用的方法。

例如,如果有一个数据库并且我设计了一个带有 CRUD 方法的服务。但我想要服务的两个不同面,其中一个面隐藏了“D”。

我实现这一点的方法是我创建了两个单独的接口,它们具有不同的常用方法名称,其中一个接口没有某些方法。所以'两张脸'....

但这是正确的方法吗?它在设计中是真实的并且可以接受的吗?或者还有另一种方法。

4

1 回答 1

0

您在谈论的是代理模式,是的,它是处理这种情况的一种可接受的方式。想想Collections.unmodifiableList(List)。此方法为更新方法(例如等)创建代理List并抛出s 。现在,问题是您是否要公开这些方法但在调用时抛出未经检查的异常并保持合同相同,或者您是否删除所有方法一起?我倾向于支持后者,否则您最终会遇到大量不兼容的接口,因为您对允许的方法调用有越来越多的排列方式,但这实际上取决于您的需求。根据定义,代理具有与其控制访问的对象相同的接口。UnsupportedOpperationExceptionboolean add(T)

现在,如果您想构建不受支持的操作,只需嵌套您的代理:

DAO crateReadOnlyProxy(DAO dao) {
  return new NoInsertProxy(new NoDeleteProxy(new NoUpdateProxy(dao)));
}

您只有 1 个接口 ( DAO) 和 4 个实现(在本例中)、真正的实现和 3 个代理实现,它们只是将它们的方法调用委托给底层 DAO(或 DAO 代理)。当然,为了让生活更轻松,您可以创建一个DAOProxyAdapter类,这样您就不必重新编写所有这些委托方法:

public class DAOProxyAdapter implements DAO {
  private DAO target;
  public DAOProxyAdapter(DAO target) { this.target = target; }
  public void insert(Object o) {target.insert(o); }
  public void delete(Object o) {target.delete(o); }
  public void update(Object o) {target.update(o); }
  public Object find(Object key) { return target.find(key); }
}
public class NoDeleteProxy extends DAOProxyAdapter {
  public NoDeleteProxy(DAO target) {super(target);}
  public void delete(Object o) { throw new UnsupportedOperationException(); }
}
于 2013-04-30T10:32:33.763 回答