简单的答案是拥有一个包含所有常规操作的接口,其中还包括stop()方法。
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
stop();
}
stop方法的主要问题是,获取对服务的引用的大多数客户端可能也不应该也能够停止服务。
另一种选择是简单地定义两个接口,即服务和Stoppable
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
}
interface Stoppable {
void stop();
}
这种方法的唯一问题是如果实现被另一个Service包装,那么stop方法就会隐藏起来。
阻止客户“停止”服务的原始问题仍然存在,他们只需要首先检查引用是否是Stoppable的实例,然后他们就可以“停止”它。
您如何解决这个问题?
我有一个想法,可以优雅地解决问题(对我而言),而不会留下公共停留。然而,在我展示它之前,我想要一些想法。
答案 0 :(得分:-1)
使用接口继承:
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
}
interface StoppableService extends Service {
void stop();
}
只需要原始服务的客户通过适当的工厂方法获得。任何应该能够停止服务的东西,请求StoppableService。
如果你担心客户端转换为StoppableService可以调用stop(),那么你需要你的具体实现来分离出这个函数。给他们一个具有no(op)版本的stop()的具体实现。你仍然可以让你的工厂为任何能够阻止它的人提供stop()的工作实现。也许当他们要求您的工厂实施时,他们可以传递适当的凭据,以便您可以确定他们应该做什么并给他们正确的版本。
答案 1 :(得分:-1)
您可以执行类似
的操作interface Service {
operation( parameters ...);
somethingElse( parameters ... );
<E> E getControlInterface(Class<E> clazz);
}
然后
Stoppable stoppable = service.getControlInterface(Stoppable.class);
if (stoppable != null) {
stoppable.stop();
}
但我认为这太复杂了,实现Stoppable
接口就足够了。包装器应该知道Stoppable
并实现它。