퇴근5분전


명령 자체를 객체로 만든다 라는 개념인데 잘 보면 어렵진 않고...

다만 이걸 어따 써먹느냐..가 관건인듯 하다.

늘 그렇듯이 쌓아올린 지식은 지혜로 바꾸어내야만 한다. 써먹을수 있는 지식을 많이 가지는 것이 곧 내가 지향하는 목표가 아닌가..

 프로그래밍에 대한 전반적인 지식들은 인터넷, 서적등으로 얼마든지 취할수 있으나 이것을 써먹지 못하면... 알아서 뭐하겠는가? 

  간단히 커맨드패턴을 요약하자면..
 
1. 명령{ 수행() }

2. 수행객체{  수행할일(); }

1 + 2 . 명령처리객체 : 명령
{
    수행객체 ;
   
    수행() { 수행객체.수행()}
}

3. 요청처리객체
{
   명령;
   수행(){  명령.수행() }
}
 
보통의 객체와 객체사이의 메세지 전달구조에서는 객체와 객체간에 메세지를 공통으로 사용하기 위해서 Interface를 사용하는데 단일 메서드 일때는 그냥 호출해도 되지만  한번에 호출될 메세지가 많을때 이를 캡슐화 할때 이용할수 있다.

 예제로 본 문서에는 전사, 법사, 힐러 같은경우를 예로 들고 있다
Attack() 공격시  전사가 취하는 행동, 법사가 취하는 행동, 힐러가 취하는 행동이 각각 다르지만. Attack()이란 명령으로 통합관리 할수 있고 이를 커맨드패턴을 이용하는 기법에 대해 설명하고 있다.

1.
명령 { Attack() }

2.
전사{ 준비자세(); 칼을 든다(); 후려친다(); 준비자세(); }
법사{ 준비자세(); 책을 편다(); 스킬시전한다(); 준비자세();}
...

1 + 2.
 전사명령처리 : 명령 { 
  전사;
  Attack()
{
전사.준비자세(); 
전사.칼을든다();
전사.후려친다();
전사.준비자세();
}
}

3. 캐릭터명령
{
     명령 : 
     SetCmd( 명령 );
     Attack(){ 명령.Attack();  }
}

전사 워리어 = new 전사();
명령 cmd = new 전사명령처리( 워리어 );
캐릭터명령  cCmd = new 캐릭터명령( );
cCmd.SetCmd( cmd );
cCmd.Attack();  


뭐 이런식이라는데... 

명령을 객체화 하여 실제행동에 사용되는 객체와  명령을 요청한 객체간 관계를 느슨하게 만들어주는... 역할을 한다.

느슨하게!! 라는것에 대한 생각을 해볼필요가 있어보인다.