Java 应该如何停止需要停止的服务,而不是客户端停止的服务?
简单的答案是拥有一个包含所有常规操作的接口,其中还包括一个stop()方法 stop方法的主要问题是,大多数获得服务引用的客户机可能也不能停止服务 另一种选择是简单地定义两个接口,服务和可停止接口Java 应该如何停止需要停止的服务,而不是客户端停止的服务?,java,design-patterns,class-diagram,Java,Design Patterns,Class Diagram,简单的答案是拥有一个包含所有常规操作的接口,其中还包括一个stop()方法 stop方法的主要问题是,大多数获得服务引用的客户机可能也不能停止服务 另一种选择是简单地定义两个接口,服务和可停止接口 interface Service { operation( parameters ...); somethingElse( parameters ... ); } interface Stoppable { void stop(); } 这种方法的唯一问题是,如果实现被另
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
}
interface Stoppable {
void stop();
}
这种方法的唯一问题是,如果实现被另一个服务包装,那么stop方法就会隐藏起来
阻止客户端“停止”您的服务的最初问题仍然是可能的,他们只需要首先检查引用是否是Stoppable的实例,然后他们就可以“停止”它
你将如何解决这个问题
我有一个想法,它可以优雅地(对我来说)解决这个问题,而不需要留下一个公共站点。不过,在展示之前,我想了解一些想法。使用接口继承:
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
}
interface StoppableService extends Service {
void stop();
}
只需要原始服务的客户机通过适当的工厂方法获得该服务。任何应该能够停止服务的内容,请请求StoppableService
如果您担心客户端调用StoppableService can调用stop(),那么您需要具体的实现来分离这个函数。给他们一个具体的实现,该实现具有stop()的no-op版本。您仍然可以让您的工厂向任何应该能够停止它的人提供stop()的工作实现。也许当他们要求从您的工厂实施时,他们可以传递适当的凭据,这样您就可以确定他们应该能够做什么,并为他们提供正确的版本。您可以这样做
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
<E> E getControlInterface(Class<E> clazz);
}
但我认为这太复杂了,实现
Stoppable
接口就足够了。包装商应该知道可停止的并实现它。我很想看看你对这个问题的优雅解决方案。你需要为你的最后一段想法举个例子。如果我理解你的说法,工厂根据一些神奇的凭证返回服务或可停止的服务。这是有缺陷的,因为任何使用该工厂的人都想要一项服务,将凭据引入其中意味着解决方案变得混乱,因为我们现在必须管理哪些凭据足以获得可停止的服务。大多数应该能够调用stoppable的东西都不关心服务部件,他们只想在需要停止时调用stoppable()。将两个不相关的接口混合在一起是一种不好的做法。因此,如果你做了一些生命周期处理,你得到的不仅仅是一个可停止的,你的工厂实际上提供了两种不同的不相关类型的东西——服务和可停止的。恶心@mP-如果你想基于给出的理由保持服务和停止,这是很公平的。最初的问题没有说得特别清楚。我可以帮助解释工厂的部分,但考虑到我已经被否决了(我猜是你,如果不是的话,我道歉),我没有太大的动力这么做。我的q说,普通客户自己不应该打电话给stop()。根据您的建议,他们可以在调用service.getControlInterface后调用stop…将Stoppable.class传递给getControlInterface有什么意义?我能传递的其他参数有哪些,tehre应该是一个单一的答案,所以问这个问题是没有意义的。谁是“常规”的,谁不是?这里需要某种身份验证和授权。这不是语言或设计模式的问题。
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
<E> E getControlInterface(Class<E> clazz);
}
Stoppable stoppable = service.getControlInterface(Stoppable.class);
if (stoppable != null) {
stoppable.stop();
}