gpt4 book ai didi

java - 同一服务的两个面孔..如何设计?

转载 作者:行者123 更新时间:2023-12-01 04:48:02 24 4
gpt4 key购买 nike

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

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

我实现这一目标的方法是我创建了两个单独的接口(interface),其中通用接口(interface)具有不同的方法名称,并且其中一个接口(interface)没有某些方法。所以“两张脸”....

但是这是正确的方法吗?它在设计上是否真实且可以接受?或者还有其他方法。

最佳答案

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

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

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

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

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(); }
}

关于java - 同一服务的两个面孔..如何设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15496542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com