2011-02-15 5 views
2

안녕하십니까. 필자는 명령 패턴을 읽고 필자가 원하는 것을 적합하게 만들 수 있는지 궁금해했습니다.입니까? 조언

기본적으로 서버와 소켓 연결을 구성하는 클라이언트가 있습니다. 내 서버에는 클라이언트가 메소드를 호출해야하는 클래스 'foo'가 있습니다.

foo에 내 클라이언트가 호출 할 5 개의 메소드가 있다고 가정합니다. 내가 서버에서 demarshalled 개체를 마샬링의 과거에 실수를 저질 렀다. 그런 다음 객체의 변수를 확인하고 switch 문을 사용하면 서버 로직이 어떤 작업을 호출해야 하는지를 결정할 수 있습니다.

저는 이것을 피하고 싶습니다. 그래서 명령 패턴이 나를 도울 수 있다고 생각합니다. 하지만, 서버에 내 'foo'클래스에 대한 예제, foo에서 호출 할 수있는 각 메서드에 대한 명령 클래스를 만들어야합니까? 클라이언트에서 서버로 전송되는 클래스가 명령 클래스 여야합니까? 이 경우에는 수신기가 하나만 필요합니까? - foo 클래스?

대단히 감사합니다. 'foo'클래스 이름에 대해 사과드립니다. 나는 구체적인 클래스 이름을 아직 가지고 있지 않다!

안부

+2

키보드에 'Shift'또는 'Caps Lock'키가 있습니까? – fiction

+1

내 아이폰에서 글 쓰는 이유는 무엇입니까? – Joeblackdev

+1

사람들이 당신의 질문을 진지하게 받아들이기를 원하면 대문자로 시작하는 적절한 문장을 쓰는 것이 중요합니다 ("I"를 쓰는 것뿐만 아니라). – hlovdal

답변

4

은 아무리 당신이 무엇을, 당신은 완전히 그 스위치() 문을 제거 할 수 없습니다되지 않습니다.

그런 다음
abstract class AbstractCommand() { 
    abstract void execute(); 
} 
class ConcreteCommand extends AbstractCommand { 
    // execute implementation 
} 
// more command classes as needed; probably one per each of your method calls 

당신이 명령 공장 : 명령 패턴은 다음 당신이 제안

class CommandFactory { 
    AbstractCommand createCommandForMessage(Message m) { 
    // ... switch() goes here 
    } 
} 

그리고 일부를 수신 메시지는이처럼 간단하게 :

public class MessageReceiver { 
    public void work() { 
    while (true) { 
     Message m = receiveMessage(); 
     AbstractCommand command = commandFactory.createCommandForMessage(m); 
     command.execute(); 
    } 
    } 
} 

무엇 좋다 이것에 관해서는 메쉬를받는 방법을 알고있는 논리에서 사용할 명령을 결정하는 논리에서 명령의 실제 논리 (execute() 메서드 구현)를 명확하게 분리해야합니다 네트워크상의 현인들.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 (내가 읽은 것에서) 명령 패턴이 switch 또는 여러 else/if 조건부 논리에 대한 필요성을 제거한다고 생각했다. 또한 여기서 사용하는 ccommandFactory를 따를지는 잘 모르겠습니다. Command 패턴에 대해 읽은 다른 예제와 다른 점을 조금 설명 할 수 있습니까? 다시 많은 감사드립니다. – Joeblackdev

+0

또한 명령 패턴은 소켓을 통해 서버 작업을 호출하는 클라이언트의 수단으로 적합한 선택입니까? 감사합니다 – Joeblackdev

+1

스위치()를 완전히 제거 할 수 없습니다 : 수신하는 패킷 유형에 따라 다르게 처리해야합니다. 예를 들어 의 맵을 사용할 수는 있지만 논리적으로는 여전히 똑같습니다. CommandFactory는이 switch()가 실제로 발생하는 곳입니다. 따라서 코드는 다음 세 부분으로 분리됩니다. 1. 메시지 수신자, 2. 명령 생성자 및 3. 명령 논리. 과거에 소켓 통신에이 정확한 패턴을 사용했고 유연하고 확장하기 쉽다는 것을 알았습니다. 그래서 그것을 권하고 싶습니다. – iluxa