1의 경우에서 Strategy Pattern을 사용해서 각각 Marin, Firebet, Medic을 구현을 다 해놓고 나니, Zerg Unit를 다른 개발자가 개발해서 들고 왔다.
따라서, BaseUnit과의 호환성을 맞추어주기 위해서 ZergUnitToBaseUnit이라는 Adapter를 구성해준다.
구성된 zerg unit을 이용해서 terran과 zerg의 난타전을 테스트하면 다음과 같다.
보면, Zerg와 Terran의 Unit을 다루는 법이 동일하게 변경되었다. 다른 인터페이스와 동일하나, class의 변경은 이루어지지 않는다.
그런데, 각 unit의 method가 다르기 때문에 사용할 수가 객체가 어떤 형태인지에 따라 접근 방법을 달리 해줘야지 되는 문제가 발생되었다. 이럴 때에, Method의 Interface를 한번 덮어줘서 사용하고자 하는 interface로 변경해주는 것만으로, 이런 문제를 해결 할 수 가 있다. 이것이 Adapter Pattern이다.
기본적으로 Zerg Unit는 MoveTo를 갖지만, Attack이 아닌 Bite Method를 갖는다.
그렇지만, 본질적으로 Bite, RunTo Method는 BaseUnit의 Attack, MoveTo와 유사 동작을 하기 때문에
Public으로 선언된 각 Method를 변경시켜주면 된다.
1.
public
abstract
class
ZergUnitBase
2.
{
3.
//Terran 의 Unit과는 다른 Bite와 Run Method를 가지고 있다.
4.
public
abstract
String Bite();
5.
public
abstract
String Run(String direction);
6.
}
01.
public
class
ZergUnitToBaseUnit : BaseUnit
02.
{
03.
private
readonly
ZergUnitBase zergUnitBase;
04.
05.
public
ZergUnitToBaseUnit(ZergUnitBase zergUnitBase)
06.
{
07.
this
.zergUnitBase = zergUnitBase;
08.
}
09.
10.
public
override
string
Attack()
11.
{
12.
return
zergUnitBase.Bite();
13.
}
14.
15.
public
override
string
MoveTo(
string
direction)
16.
{
17.
return
zergUnitBase.Run(direction);
18.
}
19.
}
1.
BaseUnit unit1 =
new
ZergUnitToBaseUnit(
new
Zergling());
2.
BaseUnit unit2 =
new
ZergUnitToBaseUnit(
new
Hydralisk());
3.
4.
Console.WriteLine(unit1.Attack());
5.
Console.WriteLine(unit2.MoveTo(
"Terran"
));