如何停止需要停止但不受客户限制的服务?

时间:2011-01-20 10:36:58

标签: java design-patterns class-diagram

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

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

   stop();
}

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

另一种选择是简单地定义两个接口,即服务和Stoppable

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

interface Stoppable {
    void stop();
}

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

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

您如何解决这个问题?

我有一个想法,可以优雅地解决问题(对我而言),而不会留下公共停留。然而,在我展示它之前,我想要一些想法。

2 个答案:

答案 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并实现它。