디자인 패턴의 꽃이라고 불릴만큼 많이, 다양하게 사용하는 패턴이다.
알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다. 즉 기존 코드의 변경 없이도 실제 로직을 바꿀 수 있게 해주는 패턴이다.
1) 먼저 필요한 strategy 인터페이스를 만들어준다.
public interface MoveStrategy {
int moveValue();
}
2) 해당 인터페이스를 필요한 기능에 따라 실제로 구현한다.
public class RandomMove implements MoveStrategy {
private static final int MIN_NUMBER = 0;
private static final int MAX_NUMBER = 9;
@Override
public int moveValue() {
return RandomUtils.nextInt(MIN_NUMBER, MAX_NUMBER);
}
}
public class UnconditionalMove implements MoveStrategy {
private static final int MOVE_STANDARD = 4;
@Override
public int moveValue() {
return MOVE_STANDARD;
}
}
3) 사용하는 쪽에서는 인터페이스 타입을 매개변수로 받아 사용한다.
public class Car {
private static final int MOVING_BASELINE = 4;
private int position;
/*...*/
public void move(MoveStrategy moveStrategy) {
if (moveStrategy.moveValue() >= MOVING_BASELINE) {
this.position++;
}
}
}
4) 클라이언트에서 사용할 때 전략만 바꿔 끼워주면 코드 변경없이 실제 로직이 바뀐다.
public class Application {
public static void main(String[] args) {
Car car = new Car();
car.move(new RandomMove());
car.move(new UnconditionalMove());
}
}