전략패턴은 무엇이며, 전략패턴을 사용하는 상황을 소개하고 실제 코드에 적용한 내용을 정리하기 위한 포스트 입니다.
전략 패턴(Strategy Pattern)은 행위패턴의 한 종류로 다양한 전략(알고리즘, 행위)를 하나의 클래스(인터페이스)로 캡슐화 하여 알고리즘의 대체가 가능하도록 설계된 패턴이다.
객체를 사용하는 코드에서 어떤 패턴클래스가 할당 됐는지엔 관계없이 인터페이스만을 인자로 받아서 그대로 내부 메서드를 수행한다.
객체의 내부 코드를 수정할 필요없이 유연한 변경에 대처할 수 있다.
이후에 소개할 상태 패턴과 유사해 헷갈릴 수도 있다(둘다 행위패턴).
왜냐하면 둘다 인터페이스를 사용해 어떤 클래스가 할당(구현체) 되었는지 관계없이 내부의 동일 메서드를 수행하기 때문이다.
여기서 전략 패턴은 전략을 사용자 혹은 외부에서 변경 해 주어야 하고, 상태 패턴은 스스로가 상태를 변환 할 수있다.
따라서 전략패턴은 전략을 사용자가 선택해서 상황에 맞는 행동을 하게 할때 주로 사용한다.
그예로 환율을 다르게 적용하여 계산하기, 해쉬값을 생성할때 알고리즘을 다르게 적용하여 생성하기와 같은 전략이 있을 수있다.
전략패턴을 자동차 경주 미션에 적용한 코드로 설명하겠다.
public interface MoveConditionStrategy {
boolean isMovable();
}
public class RandomMoveConditionStrategy implements MoveConditionStrategy {
private static final int MOVE_CONDITION = 4;
@Override
public boolean isMovable() {
if (RandomNumber.makeOneRandomNumber() > MOVE_CONDITION) {
return true;
}
return false;
}
}
public class Car {
private String name;
private DistanceLog distanceLog;
private MoveConditionStrategy moveConditionStrategy;
public Car(String name, MoveConditionStrategy moveConditionStrategy) {
this(name, moveConditionStrategy, INITIAL_DISTANCE);
}
MoveConditionStrategy moveConditionStrategy = new RandomMoveConditionStrategy();
new Car("새자동차",moveConditionStrategy);