본문 바로가기

공부/컴퓨터

command 패턴을 이용한 아바타 채팅 서버.

반응형

안녕하세요.
찬 입니다.

유니님 덕분에 command 패턴을 한번 공부해 봤습니다.

그 결과로 아바타 채팅 서버를 command 패턴으로 바꾸어 보았습니다.

아래 그림은 command 패턴을 사용한 클래스들의 목록 입니다.

ChatServer 에서는 유저 한명당 Handler을 하나씩 돌리고
Handler에서는 채팅의 프로토콜에 따라
hashtable을 사용한 ProtocolMap에서 각각 기능에 맞추어서
로그인 했을때는  ParseLogIn ,
일반적인 채팅 메시지 일때에는 ParseChatMessage 클래스가 동작 되도록 되어 있습니다.

만약 클래스가 서로 다르다면 실행 시키는 명령 또한 클래스 마다
하나씩 있어야 하겠지만 Parse라는 인터페이스를 만들어서.
각각의 ParseLogIn , ParseChatMessage 등에서 implement 해 주어.
사용할때에는.
((Parse)(hasttable.get((Object)"PROTOCOL"))).parse();

이런식으로 Interface인 Parse 형으로 바꾸어서 parse() 를 구현하여 실행 시키면 된다.

위의 그림은 각각 클래스의 구조(?) 이다.

Handler의 클래스의 parse_protocol( .. ) 메소드는 다음과 같았다.

public void parse_protocol(String packet)
{
        System.out.println("[Server] 받은 패킷--->"+packet);
        StringTokenizer st=new StringTokenizer(packet);
        String part=st.nextToken("|*|");
        switch(Integer.parseInt(part))
        {
                case 110:
                        break;
                case 111:
                        break;
                case 100:                                        
                        send_list();
                        String st_id=st.nextToken("|*|");
                        String st_nickname=st.nextToken("|*|");
                        broadcast("005|*|"+st_id+"|*|"+st_nickname);                                add_user(st_id,st_nickname);                                                                                                                 break;
                case 112:
                        broadcast(packet);
                        break;
        
                case 003:                                                                        delete_user(ID);                                                        nowStat=packet;
                        broadcast(packet);                                                        add_user(ID,NickName);                 //다시 본인은 추가시키고
                        break;
                case 004:        //임의 사용자가 퇴장함  HashTable 에서 해당 사용자 제거 ..
                        delete_user(st.nextToken("|*|"));                                                broadcast(packet);
                        break;
                }
        }




하지만 command 패턴으로 리팩토링(?) 하고 난 뒤에는
다음과 같이 변하였다.

        public void parse_protocol(String packet)
        {
                System.out.println("[Server] 받은 패킷--->"+packet);
                StringTokenizer st=new StringTokenizer(packet);
                String part=st.nextToken("|*|");
                
                ((Parse)(pm.mapping()).get((Object)part)).parse(packet);
        }

물론 각 Parse의 하위 클래스에서 따로 구현 되었다.

대신 훨씬더 보기 좋고, 각 클래스로 나누어서 구현 부분이 되어 있기 때문에,
(하나의 행위(행동)에 대해서는 하나의 클래스로 나누어져 있음)
나중에 하나의 행위를 고치기 위해서는 그 클래스만 수정 하면 된다.
반응형