Decorator Pattern 예제(끝)
1305800915.bmp
무기쪽을 decorator pattern을 사용하여 다이어그램을 그려보았습니다.
저 주황색 부분 때문에 저 화면에 있는 모든 클래스들은 Human이 되며.. 그 중에서도 특히 WeaponDecorator 클래스들은 Human type의 모든 클래스들을 감쌀 수 있습니다.(멤버 변수로 Human 타입의 변수를 가지고 있기 때문이지요.) 용법은
Integer hp = 100;
Integer mp = 50;
Human worrior = new Worrior(name, hp, mp);
녹색 부분 처럼 감쌀 수가 있게 되는 것입니다.
구현은 먼저 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)법칙에 따라 생략하겠습니다.