[디자인 패턴] Strategy Pattern
2021. 3. 16. 12:24ㆍJava/디자인 패턴
전략 패턴(Strategy Pattern)
- 객체가 할 수 있는 행위들 각각을 전략(클래스별로 캡슐화)으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것(필요시 교체)만으로 행위의 수정이 가능하도록 만든 패턴
- 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
- 전략을 쉽게 바꿀 수 있도록(시스템이 유연하게 변경되고 확장될 수 있도록) 해주는 디자인 패턴
전략
- 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비니지스 규칙, 문제를 해결하는 알고리즘 등
전략 패턴 구현
1) 전략 생성
public interface MovingStrategy {
boolean movable();
}
import java.util.Random;
public class RandomMovingStrategy implements MovingStrategy{
private static final int RANDOM_RANGE = 10;
private static final int MOVE_RESTRICT = 4;
@Override
public boolean movable() {
return getGenerateRandomNumber() >= MOVE_RESTRICT;
}
private int getGenerateRandomNumber() {
Random random = new Random();
return random.nextInt(RANDOM_RANGE);
}
}
2) 전략 패턴 구현
- 이동 방식을 직접 메서드로 구현하지 않고, 어떻게 움직일 것인지에 대한 전략을 설정
- 전략의 움직임 방식을 사용하여 움직이도록 구현
public class Racing {
...
public void play(int totalRound) {
for(int i=0; i<totalRound; i++) {
cars.run(new RandomMovingStrategy());
}
}
...
}
public class Cars {
private List<Car> cars;
...
public void run(MovingStrategy movingStrategy) {
cars.forEach(car -> car.move(movingStrategy));
}
...
}
public class Cars {
private List<Car> cars;
...
public void run(MovingStrategy movingStrategy) {
cars.forEach(car -> car.move(movingStrategy));
}
...
}
3) 테스트 코드
@Test
@DisplayName("이동 테스트")
void move() {
Car car = new Car("test");
car.move(new MovingStrategy() {
@Override
public boolean movable() {
return true;
}
});
assertThat(car.getPosition()).isEqualTo(new Position(1));
}
@Test
@DisplayName("정지 테스트")
void stop() {
Car car = new Car("test");
car.move(new MovingStrategy() {
@Override
public boolean movable() {
return false;
}
});
assertThat(car.getPosition()).isEqualTo(new Position(0));
}
참고
https://victorydntmd.tistory.com/292
https://gmlwjd9405.github.io/2018/07/06/strategy-pattern.html
https://en.wikipedia.org/wiki/Strategy_pattern