디자인패턴 / / 2022. 9. 15. 06:53

전략 패턴 (Strategy Pattern)

방법이나 책략

전략패턴이란

전략의 사전적 정의는 "방법이나 책략" 인데, 이러한 방법은 쉽게 적용했다가 쉽게 바꿀 수 있다. 전략패턴은 행동패턴 중 하나로 행위(방법, 전략)를 클래스로 캡슐화하여, 런타임 중 동적으로 행위를 쉽게 바꿀 수 있는 패턴이다.

상속보다는 조합(Composite)를 사용하라는 객체지향의 지향점과도 알맞는 패턴이다.

다이어그램

Strategy는 특정기능을 정의한 인터페이스이며 ConcreteStrategyA, B는 인터페이스의 구현클래스이다.
Context의 strategy 멤버변수를 통해 특정기능의 상속이 아닌 위임의 형태를 취했으며 setStrategy() 메소드를 통해 행위를 원할때 변경할 수 있다.

아래 Vehicle 클래스가 있고, Vehicle 클래스를 상속한 Car, Bus 클래스가 있다.
Vehicle 클래스는 Fuel 메소드와 Move 메소드가 있다. 자동차는 종류에 따라 연료가 가솔린, 경유로 구분되며 속력도 특정 이하로 제한되는 경우가 많다.

public abstract class Vehicle {
  public void Fuel() {}
}

public class Car extends Vehicle {
  @Override
  public void Fuel() {
    System.out.println("휘발유 주입");
  }
}

public class Bus extends Vehicle {
  @Override
  public void Fuel() {
    System.out.println("경유 주입");
  }
}

시대가 발전됨에 따라 가솔린을 사용하는 버스, 안전을 위해 최대속력이 제한된 경차가 생긴다. 그럼 그때마다 Vehicle을 상속한 구현 클래스들을 수정해 주어야 할까?
연료에 대한 전략(가솔린, 경유)을 별도로 캡슐화하여 필요시 주입만 해준다면 쉽게 변경하지 않고 확장을 할 수 있다.

public interface FuelType {
  void Fuel();
}

public class GasolineFuel implements FuelType {
  @Override
  public void Fuel() {
    System.out.println("가솔린 주입");
  }
}

public class DieselFuel implements FuelType {
  @Override
  public void Fuel() {
    System.out.println("경유 주입");
  }
}

위와같이 연료주입에 관한 전략(행위)들을 캡슐화한다.

public class WHAT_EVER_YOU_WANT extends Vehicle {
  FuelType fuelType;

  public WHAT_EVER_YOU_WANT(FuelType fuelType) {
    this.fuelType = fuelType;
  }

  @Override
  public void Fuel() {
    fuelType.Fuel();
  }
}

그러면 나중에 생성자에서 적절한 전략(연료)을 주입하여 간단하게 수정이 가능하다

'디자인패턴' 카테고리의 다른 글

어댑터 패턴 (Adapter Pattern)  (0) 2022.11.18
커맨드 패턴 (Command Patter)  (0) 2022.11.17
데코레이터 패턴(Decorator Pattern)  (0) 2022.10.21
옵저버 패턴 (Observer Pattern)  (2) 2022.10.19
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유