[디자인 패턴] Strategy Pattern

2021. 3. 16. 12:24Java/디자인 패턴

전략 패턴(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