2011-01-20 2 views
1

쉬운 대답은 stop() 메소드가 포함 된 모든 일반 작업과의 인터페이스를 갖는 것입니다.클라이언트가 아닌 중지 할 수있는 서비스를 어떻게 중지해야합니까?

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

    stop(); 
} 

정지 방법의 주요 문제는 서비스에 대한 참조를 가져 대부분의 클라이언트는 아마 또한 서비스를 중지 할 수 없도록해야합니다.

또 다른 대안은 단순히 두 개의 인터페이스, 서비스 및 Stoppable

구현이 다음 정지 방법은 숨겨져있다, 다른 서비스에 의해 포장되는 경우이 방법의 유일한 문제는
interface Service { 
    operation(parameters ...); 
    somethingElse(parameters ...); 
} 

interface Stoppable { 
    void stop(); 
} 

을 정의하는 것입니다.

"중지"에서 클라이언트를 중지의 원래 문제는 서비스가 여전히 가능, 그들은 단지 참조 Stoppable의 인스턴스 인 경우 먼저 확인해야하고 그들은 그것을 "중지"할 수 있습니다.

이 문제를 해결할 방법

?

내가 사용할 수있는 공공 정지를 떠나지 않고 (물론 나를 위해) 우아하게 문제를 해결 아이디어를 가지고있다. 그러나 나는 그것을 보여주기 전에 몇 가지 아이디어를 원합니다.

+1

나는이 문제에 대한 당신의 우아한 해결책을 궁금 해요. – Falanwe

답변

-1

사용 인터페이스 상속 : 단지 원시 서비스가 필요

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


interface StoppableService extends Service { 
    void stop(); 
} 

클라이언트는 적절한 팩토리 메소드에 의해 주어진 얻을. 서비스를 중지 할 수있는 것이면 StoppableService를 요청하십시오. 당신이) StoppableService에 캐스팅 클라이언트가 정지 (호출 수에 대해 고민하는 경우에

, 당신은이 기능을 분리하기 위해 구체적인 구현이 필요합니다. 그들에게 no-op 버전의 stop()이있는 구체적인 구현을 제공하십시오. 공장에서 중지 할 수 있어야하는 모든 사람에게 stop()의 작동 구현을 제공하도록 할 수 있습니다. 아마도 공장에서 구현을 요청할 때 적절한 자격 증명을 전달하여 사용자가 수행 할 수 있어야 할 작업을 결정하고 올바른 버전을 제공 할 수 있습니다.

+0

아이디어의 마지막 단락에 대한 예제를 제공해야합니다. –

+0

공장에서 일부 마법 자격 증명에 따라 서비스 또는 StoppableService를 반환한다고 말하는 경우 이것은 공장을 사용하는 누군가가 서비스를 원하기 때문에 결함이 있습니다. 왜냐하면 우리는 이제 자격 증명을 얻기에 충분한 자격을 관리해야하기 때문에 솔루션이 지저분 해지는 것을 의미합니다. stoppable을 호출 할 수 있어야하는 대부분의 것들은 Service 부분을 신경 쓰지 않고 stop() 할 때만 Stoppable을 원합니다. 무관 한 두 인터페이스를 함께 사용하는 것은 나쁜 습관입니다. –

+0

따라서 수명주기를 다루는 라이프 사이클이 단순한 스토브 (Stoppable) 이상의 것을 얻는다면, 공장은 사실상 관련이없는 서로 다른 유형의 서비스 (서비스 및 스토 블)를 제공합니다. 왝! –

-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을 인식하고이를 구현해야합니다.

+0

제 q는 일반 고객이 stop()을 호출 할 수 없어야한다고 말했습니다. 귀하의 제안과 함께, 그들은 service.getControlInterface를 호출 한 후 stop을 호출 할 수 있습니다 ... –

+0

getControlInterface에 Stoppable.class를 전달하는 요령은 무엇입니까? 가능한 다른 매개 변수는 통과 할 수 있습니다. 단 한 번의 질문 만하면됩니다. –

+0

누가 '규칙적인'이고 누구가 아닌가? 여기에 일종의 인증 및 허가가 필요합니다. 그것은 언어 또는 디자인 패턴 문제가 아닙니다. – pingw33n

관련 문제