본문 바로가기

공부/컴퓨터

[디자인 패턴] Command 패턴

반응형
안녕하세요.
찬 입니다.

모두 잘 아시다시피 전 -_- 왕 초보라.
여기 클럽장 님과 유니님 덕분에 많은 공부를 하고 있답니다.

이번에 유니님이 이야기 해 주신 command 패턴에 대한 아주 간단하고 좋은
예제를 하나 구해서 올려 보겠습니다.
( 다음에 디자인 패턴 쪽이나 이런 메뉴가 생기면 이 글을 복사를 하던지 옮기던지 하겠습니다.)
( 뭐 -_- 굳이 안 옮겨도 상관은 없지만 ;; )



자바스터디 넷 에서 본 자료 입니다.

이 예제 및 글은 대화방의 서버 부분에서 프로토콜을 분리(?) 할때 사용때
어떤 패턴이 좋겠느냐는 질문에 대한 답이므로, 한쪽으로 치우친 예제 및 글일 수도 있습니다.



자료출처 : http://www.javastudy.co.kr/bbs/read.jsp?bbs=umlbbs&id=465&page=1&searchOpt=&searchString=&sortBy=



간단하게 주요 예제만 정리해 보았습니다.



if (command.equals("command1")) { command1(); }
else if ( command.equals("command2") ) { command2(); }
else....


이렇게 된다면  if else 문을 계속 사용하게 된다.
다음과 같이 해 보자.


public interface Command {
     public void run();
}


public class Dispatcher {

    static Hashtable commands = new Hashtable();
    
    public Dispatcher() {
        commands.put("command1", new Command1() );
        commands.put("command2", new Command2() );
        .........
    }


    public void dispatch(String command) {
        ((Command)commands.get(command)).run();
    }

}



위와 같이 해 놓고 실제 프로그램에서는

String str = someObject.getCommand();

Dispatcher dp = new Dispatcher();
dp.dispatcher(str);

이런식으로 처리하면 if else 문 없이 한줄로 명령어를 처리할 수 있다.
겉으로 보기에 이렇게 한줄로 처리함으로써. 소스를 읽기도 쉬워 지고
각각의 명령어를 하나의 클래스(위의 new Command1()과 같이 ) 로 만들어서 처리 할 수 있게 한다.



(정확하지는 않지만 현재 내가 이해하기로는 )
즉 command 패턴은 각각의 명령 마다 하나의 클래스를 만드는 것이다.
그리고 해쉬테이블을 이용해서 if else의 반복 없이,
특정 값(문자열 String)만으로 자기에게 맞는 명령을 수행시키도록 하는 것이다.



잡담 및 정리.

어떻게 보면 이것은 if else 문을 하나의 보자기(Hashtable) 안에 숨기는것과 비슷한 일을 하는것 같다.


command 패턴에서 중요한 두가지는 다음과 같다.
1. 각 명령어(수행해야할 동작)를 각각의 클래스로 작성한다.
2. hashtable을 만들어 각 클래스를 등록 시킨뒤, 키값을 이용해서 바로 클래스(수행해야할일)를 실행 시킨다.
반응형