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