Как остановить службу, которую необходимо остановить, но не клиентам? - PullRequest
1 голос
/ 20 января 2011

Простой ответ - иметь интерфейс со всеми обычными операциями, который также включает метод stop ().

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

   stop();
}

Основная проблема с методом остановки заключается в том, что большинство клиентов, которые получают ссылку на Сервис, вероятно, также не смогут остановить сервис.

Другой альтернативой является простое определение двух интерфейсов: службы и Stoppable

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

interface Stoppable {
    void stop();
}

Единственная проблема этого подхода - если реализация обернута другой службой, тогда метод stopскрыто.

Первоначальная проблема, состоящая в том, чтобы не дать клиентам «остановить» вашу службу, все еще возможна, им просто нужно сначала проверить, является ли ссылка экземпляром Stoppable, а затем они могут «остановить» ее.*

Как бы вы решили эту проблему?

У меня есть идея, которая решает проблему элегантно (хорошо для меня), не оставляя доступной общественную остановку.Однако, прежде чем я покажу это, я хотел бы кое-какие идеи.

Ответы [ 2 ]

0 голосов
/ 20 января 2011

Вы могли бы сделать что-то вроде

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 и применять его также.

0 голосов
/ 20 января 2011

Использовать наследование интерфейса:

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


interface StoppableService extends Service {
    void stop();
}

Клиенты, которым нужен только необработанный Сервис, получают его соответствующим фабричным методом.Все, что может остановить службу, запросите StoppableService.

Если вы беспокоитесь о том, что клиенты, обращающиеся к StoppableService, могут вызывать stop (), то вам понадобятся ваши конкретные реализации, чтобы выделить эту функцию.Дайте им конкретную реализацию, которая имеет неоправданную версию stop ().Вы все еще можете сделать так, чтобы ваша фабрика предоставляла работающую реализацию stop () любому, кто сможет ее остановить.Возможно, когда они запрашивают реализацию от вашей фабрики, они могут передать соответствующие учетные данные, чтобы вы могли определить, что они должны быть в состоянии сделать, и дать им правильную версию.

...