스트래티지 패턴을 이해한다.

Goal

  • 스트래티지 패턴의 개념을 이해한다.
  • 예시를 통해 스트래티지 패턴을 이해한다.

스트래티지 패턴이란

참고

예시

로봇 만들기

public abstract class Robot {
  private String name;
  public Robot(String name) { this.name = name; }
  public String getName() { return name; }
  // 추상 메서드
  public abstract void attack();
  public abstract void move();
}

public class TaekwonV extends Robot {
  public TaekwonV(String name) { super(name); }
  public void attack() { System.out.println("I have Missile."); }
  public void move() { System.out.println("I can only walk."); }
}
public class Atom extends Robot {
  public Atom(String name) { super(name); }
  public void attack() { System.out.println("I have strong punch."); }
  public void move() { System.out.println("I can fly."); }
}
public class Client {
  public static void main(String[] args) {
    Robot taekwonV = new TaekwonV("TaekwonV");
    Robot atom = new Atom("Atom");

    System.out.println("My name is " + taekwonV.getName());
    taekwonV.move();
    taekwonV.attack();

    System.out.println()
    System.out.println("My name is " + atom.getName());
    atom.move();
    atom.attack();
  }
}

문제점

  1. 기존 로봇의 공격과 이동 방법을 수정하는 경우
    • Atom이 날 수는 없고 오진 걷게만 만들고 싶다면?
    • TaekwonV를 날게 하려면?
      public class Atom extends Robot {
        public Atom(String name) { super(name); }
        public void attack() { System.out.println("I have strong punch."); }
        public void move() { System.out.println("I can only walk."); } // 수정
      }
      
    • 새로운 기능으로 변경하려고 기존 코드의 내용을 수정해야 하므로 OCP에 위배된다.
    • 또한 TaekwonV와 Atom의 move() 메서드의 내용이 중복된다. 이런 중복 상황은 많은 문제를 야기하는 원인이 된다.
    • 만약 걷는 방식에 문제가 있거나 새로운 방식으로 수정하려면 모든 중복 코드를 일관성있게 변경해야만 한다.
  2. 새로운 로봇을 만들어 기존의 공격(attack) 또는 이동 방법(move)을 추가/수정하는 경우
    • 새로운 로봇으로 Sungard를 만들어 TaekwonV의 미사일 공격 기능을 추가하려면?
      public class Sungard extends Robot {
        public Sungard(String name) { super(name); }
        public void attack() { System.out.println("I have Missile."); } // 중복
        public void move() { System.out.println("I can only walk."); }
      }
      
    • TaekwonV와 Sungard 클래스의 attack() 메서드의 내용이 중복된다.
    • 현재 시스템의 캡슐화의 단위가 ‘Robot’ 자체이므로 로봇을 추가하기는 매우 쉽다.
    • 그러나 새로운 로봇인 ‘Sungard’에 기존의 공격 또는 이동 방법을 추가하거나 변경하려고 하면 문제가 발생한다.

해결책

문제를 해결하기 위해서는 무엇이 변화되었는지 찾은 후에 이를 클래스로 캡슐화해야 한다.

관련된 Post

References