Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应该如何停止需要停止的服务,而不是客户端停止的服务?_Java_Design Patterns_Class Diagram - Fatal编程技术网

Java 应该如何停止需要停止的服务,而不是客户端停止的服务?

Java 应该如何停止需要停止的服务,而不是客户端停止的服务?,java,design-patterns,class-diagram,Java,Design Patterns,Class Diagram,简单的答案是拥有一个包含所有常规操作的接口,其中还包括一个stop()方法 stop方法的主要问题是,大多数获得服务引用的客户机可能也不能停止服务 另一种选择是简单地定义两个接口,服务和可停止接口 interface Service { operation( parameters ...); somethingElse( parameters ... ); } interface Stoppable { void stop(); } 这种方法的唯一问题是,如果实现被另

简单的答案是拥有一个包含所有常规操作的接口,其中还包括一个stop()方法

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