1305800915.bmp
무기쪽을 decorator pattern을 사용하여 다이어그램을 그려보았습니다.
저 주황색 부분 때문에 저 화면에 있는 모든 클래스들은 Human이 되며.. 그 중에서도 특히 WeaponDecorator 클래스들은 Human type의 모든 클래스들을 감쌀 수 있습니다.(멤버 변수로 Human 타입의 변수를 가지고 있기 때문이지요.) 용법은

String name = "백기선";
Integer hp = 100;
Integer mp = 50;
Human worrior = new Worrior(name, hp, mp);

worrior = new LongSword(worrior);

녹색 부분 처럼 감쌀 수가 있게 되는 것입니다.

구현은 먼저 Human쪽 부터 구현을 하고 그다음 WeaponDecorator..그다음은 뭐. 방어구도 Decorator로 하고 질병이며.. 나머지도 그런식으로 하면 될 듯합니다.

먼저 HumanTest class부터 작성합니다.

[#M_HumanTest code 보기|닫기|
package chracters;

import characters.*;
import junit.framework.TestCase;

public class HumanTest extends TestCase {

   public void testCreateWorrior() {
       Integer hp = 100;
       Integer mp = 50;
       Human worrior = new Worrior("박정석", hp, mp);
       confirmHPAndMp(worrior, 100, 50);
   }

   public void testCreateMagician() {
       Integer hp = 50;
       Integer mp = 100;
       Human magician = new Magician("임요환", hp, mp);
       confirmHPAndMp(magician, 50, 100);
   }

   public void testCreateThief() {
       Integer hp = 75;
       Integer mp = 75;
       Human thief = new Thief("홍진호", hp, mp);
       confirmHPAndMp(thief, 75, 75);
   }

   private void confirmHPAndMp(Human human, Integer hp, Integer mp) {
       assertEquals(human.getHp().intValue(), hp.intValue());
       assertEquals(human.getMp().intValue(), mp.intValue());
   }

   public void testDescription() {
       String name = "박정석";
       Integer hp = 100;
       Integer mp = 50;
       Human worrior = new Worrior(name, hp, mp);
       confirmHPAndMp(worrior, 100, 50);

       String description = worrior.getDescription();
       assertEquals(description, name + " 전사 입니다.\n" + hp + " HP과 " + mp
       + " MP를 가지고 있습니다.");
   }
}
_M#]
이정도 하면..Human쪽은 끝난 듯 하군요.

WeaponTest 클래스를 먼저 작성하고.. 위의 다이그램에 맞춰가며 클래스들을 구현해 갑니다.

[#M_WeaponTest class 보기|닫기|
package weapons;

import characters.Human;
import characters.Worrior;
import junit.framework.TestCase;

public class WeaponTest extends TestCase {

   Human worrior;

   public void setUp() {
       Integer hp = 100;
       Integer mp = 50;
       worrior = new Worrior("백기선", hp, mp);
   }

   public void testCreateWeapon() {
       Human someone = new ShortSword(worrior);
       assertNotNull(someone);
       someone = new LongSword(someone);
       assertNotNull(someone);
       someone = new BastardSword(someone);
       assertNotNull(someone);
   }

   public void testDescription() {
       Human someone = new ShortSword(worrior);
       String description = someone.getDescription();
       assertEquals(description, someone.getName() + " 전사 입니다.\n"
               + someone.getHp() + " HP과 " + someone.getMp()
               + " MP를 가지고 있습니다." + "\n 단검을 착용 했습니다.");
   }
}
_M#]
헉... 에러 발생..

1287911772.bmp
어라... getter들이 값을 안가져왔군요... 흠...

에러는 어떻게든 잡았고... 나머지.. 방어구 라든가.. 질병.. 뭐 그런것도 무기쪽 구현한 거랑 똑같기 때문에 DRY(Don't Repeat Yourself)법칙에 따라 생략하겠습니다.