전략 패턴이란?

디자인 패턴 중 하나로 동일 계열의 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하며, 이를 상호교환이 가능하도록 만든다. 전략 패턴의 기본적인 구조는 아래와 같다.

전략 패턴

예시

전략 패턴을 사용하지 않는 경우

public abstract class Robot {
    public abstract void move();
}

public class WalkingRobot extends Robot {

    @Override
    public void move() {
        System.out.println("걷는다!");
    }
}

public class RunningRobot extends Robot {

    @Override
    public void move() {
        System.out.println("달린다!");
    }
}

public class FlyingRobot extends Robot {

    @Override
    public void move() {
        System.out.println("난다!");
    }
}

다음과 같이 여러 가지 이동 방법을 가질 수 있는 로봇이 있다면, 새로운 이동 방법이 생길 때마다, 새로운 클래스를 만들어야된다. 또한 이동 방법 뿐만 아니라 새로운 기능을 추가할 때마다, 클래스의 수는 기하급수적으로 늘어난다.

전략 패턴을 사용한 경우

public class Robot {
    private MoveStrategy moveStrategy;
	private TemperatureStrategy temperatureStrategy;

	...

    public void move() {
        moveStrategy.move();
    }
}

public interface MoveStrategy {
    void move();
}

public class Walk implements MoveStrategy {

    @Override
    public void move() {
        System.out.println("걷는다!");
    }
}

public class Run implements MoveStrategy {

    @Override
    public void move() {
        System.out.println("달린다!");
    }
}

public class Fly implements MoveStrategy {

    @Override
    public void move() {
        System.out.println("난다!");
    }
}
...

위와 같이 이동 방법을 별도의 인터페이스로 만들어 관리하게 되면 Robot클래스 하나로 여러 가지 이동 방법을 가진 로봇을 만들 수 있다. 뿐만아니라 여러 개의 알고리즘을 가진 추가적인 기능이 생겨도 클래스가 기하급수적으로 늘어나지 않는다.

JDK에서 사용된 전략 패턴

Comparator가 대표적으로 JDK에서 사용된 전략 패턴이다. 이 인터페이스를 구현하여 비교 하지 못하는 객체를 비교 가능하도록 만들 수 있고, 이를 정렬 등을 가능하게 만들 수 있다.

참고 사항

https://gmlwjd9405.github.io/2018/07/06/strategy-pattern.html

댓글남기기