본문 바로가기

Design Patterns

Strategy Pattern ② Encapsulation(캡슐화) 와 Composition(구성)을 활용한 리팩토링

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
말은 그럴싸 합니다만.. -_-;; 그럼 실제로 슬슬 고쳐보도록 하겠습니다. (텍스트 보다는 비주얼하게!!)

사용자 삽입 이미지
이렇게 한번 바까 줘 봤습니다. 유닛들의 행동을 구현하는데요.. 사실 이전에 있던 인터페이스로 행동을 구현하도록 했던 다이어 그램에 보면, SCV랑 메딕이랑 고치는 메소드도 사실은 모호했지요.. 이렇게 나눈 덕분에 사람을 고치는지 건물을 고치는지 명확해 졌구요.. 공격을 하는 경우와 공격을 하지 않는 경우, 이동을 하고, 이동을 못하는 경우의 클래스를 만들어서 해당 인터페이스의 메소드를 구현해 주면 되겠죠!! (공격 못하는 메딕에게 공격 명령을 내렸을때, 아무 것도 안하게 말이죠!!)


여기서 끝인가 했는데 아닙니다 -_-;; 이제 Terran이라는 클래스도 변경을 해줘야합니다. 그리고 유닛별 메소드들도 새로 정리를 해줘야하구요.. ㅠㅠ 자자.. 거두 절미하고.. 완성된 다이어그램 부터 보시겠습니다!

사용자 삽입 이미지

멋지지 않습니까 -.-;; 패턴이라는게 이렇게 아름다운줄 누가 알았을가요 ㅠㅠ 자바를 공부하면서 현란하게 그려진 다이어 그램을 보고, '아 저런 멋진 다이어그램이 나오는 코드를 작성할려면 어떻게 해야 할까...' 라고 생각을 했습니다만, 금방 책을 보고 열심히 끄적거리고 UML 툴을 통해 한바퀴 돌리니 이런 그림이 나오네요.. 아참, 상속과 구현을 표현하는 화살표 이외에 Composition(구성) 을 나타내는 마름모꼴의 까만 화살표가 있습니다. 구성에 대해서는 뒤에 설명을 하도록 하겠습니다.

public abstract class Terran {

      AttackBehavior attackBeHavior;

      MoveBehavior moveBeHavior;

      RestoreBehavior restoreBehavior;

      public abstract void display();

      public void doAttack() {

            attackBeHavior.attack();

      }

      public void doMove() {

            moveBeHavior.move();

      }

      public void doRestore() {

            restoreBehavior.restore();

      }

}

Terran 클래스의 소스코드 입니다. 인터페이스의 객체 3개를 속성값으로 가지고 있습니다. 세가지 메소드들을 가지고 있습니다. 공격하고, 움직이고, 치료(수리)하는 메소드들은 속성값의 메소드로 대체가 되고 있습니다. 이쁘게 다시 말하자면 -_-; 실제로 구현하여 사용할 클래스에게 행동을 위임하는 겁니다. 뭔소리냐고요 -_-;;? 밑에 코드를 보시면 이해하기 쉬우실겁니다!



public class Marine extends Terran {

      public Marine() {

            attackBeHavior = new AttackWithArms();

            moveBeHavior = new LetsMove();

            restoreBehavior = new CannotRestore();

      }

      public void display() {

            System.out.println("저는 마린입니다.");

      }

}

요건 Terran 클래스를 상속받는 Marine 클래스의 소스코드 입니다. 생성자에는 인터페이스 객체에 마린에게 맞는 형태로 구현된 인스턴스들을 세팅 해줍니다. Marine 클래스 내부에는 display() 메소드 이외에는 다른 메소드가 전혀 없습니다. 하지만, Terran 클래스에서 '행동을 위임한 메소드'를 사용하여 각각 고유의 행동을 할 수 있게 된거지요~

사용자 삽입 이미지

마린이 아주 잘 작동을 합니다!! 행복합니다~