1

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

interface Service {
   operation( parameters ...);
   somethingElse( parameters ... );

   stop();
}

stop 方法的主要问题是大多数获得服务引用的客户端可能也不应该能够停止服务。

另一种选择是简单地定义两个接口,服务和可停止

interface Service {
    operation( parameters ...);
    somethingElse( parameters ... );
}

interface Stoppable {
    void stop();
}

这种方法的唯一问题是,如果实现被另一个 Service 包装,那么 stop 方法就会被隐藏起来。

阻止客户端“停止”您的服务的原始问题仍然存在,他们只需要首先检查引用是否是 Stoppable 的实例,然后他们可以“停止”它。

你将如何解决这个问题?

我有一个想法可以优雅地解决问题(对我来说很好),而不会留下公共站点。但是在我展示它之前,我想要一些想法。

4

2 回答 2

-1

使用接口继承:

interface Service {
    operation( parameters ...);
    somethingElse( parameters ... );
}


interface StoppableService extends Service {
    void stop();
}

只需要原始服务的客户端通过适当的工厂方法获得。任何应该能够停止服务的东西,都请求 StoppableService。

如果您担心转换为 StoppableService 的客户端会调用 stop(),那么您将需要具体的实现来分离此函数。给他们一个具体的实现,它有一个无操作版本的 stop()。您仍然可以让您的工厂为应该能够停止它的任何人提供 stop() 的工作实现。也许当他们要求您的工厂实施时,他们可以传递适当的凭据,以便您可以确定他们应该能够做什么并为他们提供正确的版本。

于 2011-01-20T13:33:46.037 回答
-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并实施它。

于 2011-01-20T14:21:07.057 回答