전략 패턴 은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴
아래 소스코드를 보면
현재 상황 : move 의 randomInt의 값이 0 ~ 10 사이의 값
클라이언트 요청사항 : Ex) 랜덤의 값이 0 ~ 10의 값이아닌 0 ~100의 범위로 늘려주세요.
변경하려면 수정해야될 영역이 많아진다. 이때 전략 패턴을 사용하게 되면.
public class Car implements Comparable<Car> {
private static final int STARTING_CONDITION = 4;
private Position position;
private Name name;
public Car(final String name) {
this.name = new Name(name);
this.position = new Position();
}
public void move(int randomInt) {
moveCar(isMove(randomInt));
}
Java
복사
•
다음과 같이 변경
◦
자동차에서는 인터페이스로 정의하여 DI 의존적 주입으로 만들고
◦
외부에서 해당하는 인터페이스를 구현하여 move의 값을 넘긴다.
◦
이제 우리는 언제든지 해당하는 값들을 인터페이스를 상속받아서 유연하게 구현 할 수 있다.
package study.step5.domain.strategy;
public interface MoveStrategy {
int move();
}
Java
복사
package study.step5.domain.strategy;
import java.util.Random;
public class CarMoveStrategy implements MoveStrategy {
private static final int RANDOM_RANGE = 10;
private static final Random RANDOM = new Random();
@Override
public int move() {
return RANDOM.nextInt(RANDOM_RANGE);
}
}
Java
복사
public class Car implements Comparable<Car> {
private static final int STARTING_CONDITION = 4;
private Position position;
private Name name;
public Car(final String name) {
this.name = new Name(name);
this.position = new Position();
}
public void move(MoveStrategy moveStrategy) {
moveCar(isMove(moveStrategy.move()));
}
Java
복사
후기
오늘은 전략패턴을 이용하여, 클래스의 중요한 역할을 하는 부분을 유연하게 변경하였다. 전략패턴을 사용하게되면 테스트 코드도 유연하게 짤 수 있을뿐만아니라, 언제든지 클라이언트 요청에대해 유연하게 변경할 수 있을것 같아서 인지하고 핵심기능에 적용하면 좋을 것 같다라는 생각을 하였다.