~/tech-blog/posts/strategy-pattern — zsh

전략 패턴

전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴입니다.

아래 소스코드를 살펴보겠습니다.

현재 상황: move의 randomInt 값이 0~10 사이의 값입니다.

클라이언트 요청사항: 예) 랜덤 값의 범위를 010이 아닌 0100으로 늘려주세요.

변경하려면 수정해야 할 영역이 많아집니다. 이때 전략 패턴을 사용하면 다음과 같이 개선할 수 있습니다.

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(int randomInt) {
        moveCar(isMove(randomInt));
    }
  • 다음과 같이 변경합니다.

    • 자동차에서는 인터페이스로 정의하여 DI(의존성 주입)로 구현하고,
    • 외부에서 해당 인터페이스를 구현하여 move의 값을 전달합니다.
    • 이제 언제든지 해당 값들을 인터페이스를 구현해서 유연하게 구현할 수 있습니다.
    Java
    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()));
        }
    

후기

오늘은 전략 패턴을 이용하여 클래스의 중요한 역할을 하는 부분을 유연하게 변경했습니다. 전략 패턴을 사용하면 테스트 코드도 유연하게 작성할 수 있을 뿐만 아니라, 언제든지 클라이언트 요청에 대해 유연하게 변경할 수 있을 것 같습니다. 이 점을 잘 인지하고 핵심 기능에 적용하면 좋을 것 같다는 생각이 들었습니다.

댓글

GitHub 계정으로 로그인하시면 댓글과 질문을 남기실 수 있습니다. 남겨 주신 글은 이 저장소의 Discussions에 쌓입니다.

● main 214 posts UTF-8 LF © 2026 코징 RSS · GitHub