어떤 방식을 다양하게 구현해야 할 때 -> 전략 패턴을 사용
strategy interface -> concrete strategy
랜덤하게 움직이는 방식을 사용한다고 할 때
public interface MoveStrategy {
boolean canMove();
}
public class RandomMoveStrategy implements MoveStrategy {
private static final int THRESHOLD = 4;
private static final Random random = new Random();
@Override
public boolean canMove() {
return random.nextInt(10) >= THRESHOLD;
}
}
이런식으로 사용해줄 수 있음.
전략 패턴을 사용하면 알고리즘을 별도의 전략 클래스로 캡슐화하고, 실행 시점에 해당 전략 객체를 주입하여 행위를 변경할 수 있습니다. 이를 통해 코드 변경 없이 유연하게 알고리즘을 변경할 수 있습니다.
-> 전략을 여러 개 만들고 때에 따라서 맞는 전략으로 사용할 수 있음.
함수 매개변수는 interface 타입으로 정의하고 인자로 넘겨줄 때 그 때 필요한 concrete strategy 객체를 넘겨주면 되는 거임.
public RacingGameController(final List<String> names, final int tries, final MoveStrategy strategy) {
this.cars = new Cars(names, strategy);
this.tries = tries;
}
public static void main(String[] args) {
List<String> names = InputView.inputNames();
int tries = InputView.inputTries();
RacingGameController controller = new RacingGameController(names, tries, new RandomMoveStrategy());
controller.start();
}
아하 기존에 있는 클래스를 손 대지 않는다는 게 중요하네
그리고 단일책임원칙도 중요