본문 바로가기

강의/Design pattern

전략(Strategy) 패턴

SMALL

Strategy Pattern

여러 알고리즘을 개별 클래스로 추상화하고 공통 인터페이스로 로직을 수행하도록 코드를 바꾸지 않고 알고리즘을 변경하는 방법
Comparator가 대표적이다.
여러 알고리즘을 캡슐화하고 상호 교환 가능하게 하는 패턴. Context에서 사용할 알고리즘을 클라이언트가 선택한다.


Code Example

BlueLightRedLight

public class BluLightRedLight {
  private int speed;
  
  public BlueLightRedLight(int speed) {
    this.speed = speed;
  }
  public void blueLight() {
    if(speed == 1) {
      //log
    } else if(speed = 2) {
      //log
    }
  }
  public void redLight() {
    //log
  }
}

Client

public class Client {
  public static void main(String[] args) {
    BlueLightRedLight blueLightRedLight = new BlueLightRedLight(2);
    blueLightRedLight.blueLight();
    blueLightRedLight.redLight();
  }
}

Code Example - 2

BlueLightRedLight

public class BlueLightRedLight {
  private Speed speed;
  
  public BlueLightRedLight(Speed speed) {
    this.speed = speed;
  }
  
  public void blueLight() {
    speed.blueLight();
  }
  public void redLight() {
    speed.redLight();
  }
}

Speed

public interface Speed {
  void blueLight();
  void redLight();
}

Normal, Faster

public class Normal implements Speed {
  @Override
  public void blueLight() {
    //log
  }
  
  @Override
  public void redLight() {
  
  }
}

Client

public class Client {
  public static void main(String[] args) {
    BlueLightRedLight game = new BlueLightRedLight(new Normal());
    game.blueLight(new Normal());
    game.blueLight(new Faster());
  }
}

장단점

장점

  • 새로운 전략을 추가하더라도 기존 코드를 변경하지 않음
  • 상속 대신 위임을 사용할 수 있음
  • 런타임에 전략 변경 가능

단점

  • 복잡도 증가
  • 클라이언트 코드가 구체적인 전략을 알아야 함

Example

Comparator

Collections.sort(numbers, new comparator<Integer>() {
  @Override
  public int compare(Integer o1, Integer o2) {
    return o1 - o2;
  }
}};

ApplicationContext

SMALL

'강의 > Design pattern' 카테고리의 다른 글

방문자 (Visitior) 패턴  (0) 2022.09.22
템플릿 메소드 (Template method) 패턴  (0) 2022.09.22
상태(State) 패턴  (0) 2022.09.22
관찰자(Observer) 패턴  (0) 2022.09.22
중재자(Mediator) 패턴  (0) 2022.09.22