본문 바로가기

Design Patterns

Adapter Pattern ② 예제 소스

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
음.. 일단.. 이번에도 스타크래프트를 예를 들어서 소스코드를 만들었습니다. 우선 테란 유닛들에 대해서 잘 생각해 보면.. 모든 유닛이 공통적으로 가능한 것들이 클릭했을때 어떠한 특정한 목소리를 내는것이고.. 하나는 적군 유닛을 공격하도록 합니다. 그래서 아래와 같이 UML 이 그려졌습니다.

사용자 삽입 이미지

일단 TerranUnitInterface 라는 것을 만들어 주구요.. 이걸 구현하는 클래스가 원래는 2개가 있었습니다. 바로 Marine 클래스와 SiegeTank 클래스입니다. 둘다 attack() 과 clickIntAction() 메소드를 오버라이드 하고 있구요.. 그런데.. 확장팩이 생기면서 메딕이라는 유닛이 나타났습니다. 이유닛은 똑같이 공격 명령을 내리는데.. 메딕은 공격대신에 아군을 치료한다고 합니다. 비슷한 역할을 하는데 인터페이스 자체가 아예 틀려버리게 되었습니다.

이런 경우에는 어떻게 해결해야할까요 -ㅅ-? 그래서 필요한게 어댑터 패턴이라고 볼수가 있는거죠 -ㅅ-//

일단 살펴보도록하죠.. 아까 설명했던.. 전기 콘센트로 이야기를 좀 하자면.. -_-;; 110볼트가 되는것은 TerranUnitInterface 입니다. 그리고 220V 가 되는것은 MedicInterface 입니다.. 두 가지의 상반된 인터페이스를 결합시켜주는 것은 저 위에 보이는 MedicAdapter 클래스 입니다.

그러면 이야기가 편하겠지요 -ㅅ-.. MedicAdapter 클래스에는 MedicUnitInterface 객체에 대한 정보를 가지고 있습니다. 생성자에서는 해당 MedicUnitInterface 객체에 대한 정보를 받아와서 TerranUnitInterface 에 맞도록 변경시켜주도록 합니다. 그럴려면.. TerranUnitInterface에 대한 정보를 가지고 있어야 하기 때문에 이를 구현하게 된것이구요 -ㅅ-/// (말이 어렵지만 이해해주세요 ㅠㅠ)


예상외로 굉장히 간단합니다.. ^^ 어댑터 패턴은요.. 정말 실제 전기 콘센트 어댑터 끼우기만큼이나 쉽습니다!

그럼 실제로 작동하는지 테스트를 해보도록 하겠습니다 -ㅅ-// 아래는 테스트 코드 입니다..



이에 대한 결과는요 -ㅅ-// 이렇게 나옵니다. 생성된 MedicUnitInterface 객체를 MedicAdapter 객체로 감쌌습니다.. 감싼다고 하니까.. 데코레이터 패턴이 생각이 나는데요.. -ㅅ- 책에도 이런 내용이 조금 나옵니다..

여튼 결과를 보시죠!! 잘됩니다 ㅋㅋ
사용자 삽입 이미지


아래는 소스코드 입니다 ^^