两个面孔相同的服务..如何设计呢?

时间:2013-03-19 10:09:46

标签: java web-services rest design-patterns service

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

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

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

但这是正确的方法吗,它在设计中是真实的和可接受的吗?还是有另一种方法可以做到。

1 个答案:

答案 0 :(得分:0)

您所谈论的是代理模式,是的,它是处理这种情况的可接受方式。想想Collections.unmodifiableList(List)。此方法为List创建代理并为UnsupportedOpperationException等更新方法抛出boolean 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(); }
}