본문 바로가기

Computer Science/Design Pattern

[디자인 패턴] 전략(Strategy) 패턴

정의

  • 전략 패턴은, 정책 패턴이라고도 하며 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화된 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.
  • 전략 패턴은 여러 알고리즘이나 행동 중에서 선택해야 할 때 유용하다. 클라이언트 객체는 일련의 전략 객체 중 하나를 선택하고, 선택된 전략 객체는 클라이언트에서 필요한 일을 수행한다.
  • 예를 들어서, 동일한 작업을 수행하고 있는 여러 알고리즘이 있는 경우, 전략 패턴을 사용하여 이러한 알고리즘을 캡슐화하고 클라이언트 코드와 분리할 수 있다. 이렇게 하면 새로운 알고리즘을 추가하거나 기존 알고리즘을 변경할 때 클라이언트 코드를 변경할 필요가 없다.

전략 패턴 예시 자바코드

전략 패턴을 예시로 설명하기 위해, 간단한 로봇 시뮬레이션을 구현해본다.

시뮬레이션 시스템에서 로봇이 다양한 동작을 수행해야 할 때, 전략 패턴을 사용하여 로봇이 수행하는 동작을 교체할 수 있다.

 

먼저, 전략 객체의 인터페이스를 정의한다. 아래에서 RobotStrategy라는 인터페이스를 만들어 로봇이 수행하는 동작에 대한 메서드를 정의한다.

public interface RobotStrategy{
	void performAction();
}

 

다음으로, 전략 객체를 구현한다. 

public class WalkStrategy implements RobotStrategy {
    @Override
    public void performAction() {
        System.out.println("로봇이 걸어갑니다.");
    }
}
public class FlyStrategy implements RobotStrategy {
    @Override
    public void performAction() {
        System.out.println("로봇이 날아갑니다.");
    }
}
public class ShootStrategy implements RobotStrategy {
    @Override
    public void performAction() {
        System.out.println("로봇이 총을 쏩니다.");
    }
}

 

이제, 로봇 객체를 만들고 로봇이 수행하는 동작을 교체할 수 있는 코드를 작성한다.

public class Robot {
    private RobotStrategy strategy;

    public Robot(RobotStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(RobotStrategy strategy) {
        this.strategy = strategy;
    }

    public void performAction() {
        strategy.performAction();
    }
}

 

마지막으로, 메인 메서드에서 로봇 객체를 만들고, 다양한 전략 객체를 생성하여 로봇이 수행할 수 있는 동작을 살펴보자

public class Main {
    public static void main(String[] args) {
        Robot robot = new Robot(new WalkStrategy());

        robot.performAction(); // "로봇이 걸어갑니다."

        robot.setStrategy(new FlyStrategy());
        robot.performAction(); // "로봇이 날아갑니다."

        robot.setStrategy(new ShootStrategy());
        robot.performAction(); // "로봇이 총을 쏩니다."
    }
}

 

위 예시에서 전략 패턴을 사용해서 로봇이 수행하는 동작을 변경할 수 있다. Robot 클래스는 RobotStrategy 인터페이스를 사용해서 전략 객체를 저장하고, performAction()으로 전략 객체가 동작을 수행하게 한다.