Spring Framework

전략 패턴

coga 2024. 4. 9. 09:08

전략 패턴(Strategy pattern)은 소프트웨어 개발에서 일반적으로 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 객체 지향 프로그래밍에서 다양한 알고리즘을 정의하고 각각을 캡슐화하여 이들을 서로 교환 가능하도록 만듭니다.

전략 패턴을 사용하면 런타임 시에 알고리즘을 선택할 수 있으며, 이를 통해 다양한 알고리즘을 쉽게 추가하거나 변경할 수 있습니다. 이 패턴은 알고리즘을 호출하는 클라이언트와 알고리즘을 구현하는 클래스를 분리하여 유연성을 제공하며, 재사용 가능한 코드를 작성할 수 있도록 도와줍니다.

전략 패턴은 일반적으로 인터페이스를 사용하여 알고리즘을 정의하고, 이 인터페이스를 구현하는 다양한 클래스를 만듭니다. 클라이언트는 이러한 클래스 중 하나를 선택하여 알고리즘을 실행할 수 있습니다. 이러한 방식으로 전략 패턴은 객체 지향 설계의 다형성 개념을 활용하여 코드의 유연성과 재사용성을 높이는 데 도움을 줍니다.

 

예를 들어, 우리는 다양한 Move 알고리즘이 필요한 프로그램을 작성하고 있다고 가정해 봅시다. 이러한 알고리즘 중에는 걷기, 뛰기 등이 있을 수 있습니다.

이러한 알고리즘을 전략 패턴을 사용하여 구현할 수 있습니다. 먼저, 각각의 Move 알고리즘을 실행하는 인터페이스를 만듭니다.

public interface MoveStrategy {
    public void move();
}

이제, 캐릭터를 이동시키는 구체적인 알고리즘을 구현하는 클래스를 만들어봅시다. 여기서는 캐릭터를 걷거나 뛰게 하는 두 가지 방식으로 알고리즘을 구현해보겠습니다.

public class WalkStrategy implements MoveStrategy {
    @Override
    public void move() {
        System.out.println("걷는 중입니다.");
    }
}

public class RunStrategy implements MoveStrategy {
    @Override
    public void move() {
        System.out.println("뛰는 중입니다.");
    }
}

마지막으로, 이동 방식을 선택하는 캐릭터 클래스를 만들어봅시다. 이 클래스는 선택한 이동 방식에 따라 캐릭터를 이동시킵니다.

public class Character {
    private MoveStrategy moveStrategy;

    public void setMoveStrategy(MoveStrategy moveStrategy) {
        this.moveStrategy = moveStrategy;
    }

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

위 코드에서 setMoveStrategy() 메소드는 이동 방식을 변경하기 위한 메소드입니다. move() 메소드는 현재 선택된 이동 방식에 따라 캐릭터를 이동시킵니다.

이제, 다음과 같이 클라이언트 코드에서 사용할 수 있습니다.

public class Client {
    public static void main(String[] args) {
        Character character = new Character();

        // 걷기로 설정
        character.setMoveStrategy(new WalkStrategy());
        character.move();

        // 뛰기로 설정
        character.setMoveStrategy(new RunStrategy());
        character.move();
    }
}

위 코드에서는 먼저 걷기 방식을 선택하여 캐릭터를 이동시키고, 그 다음으로 뛰기 방식을 선택하여 캐릭터를 이동시킵니다. 이처럼 전략 패턴을 사용하면 런타임 시에 이동 방식을 변경할 수 있으므로, 캐릭터의 이동 방식을 쉽게 변경할 수 있습니다.

 

전략패턴은 OCP 관점에 보면 확장에 해당하는 변하는 부분을 별도의 클래스로 만들어 추상화된 인터페이스를 위임하는 방식.

※ Context : Character 클래스

※ Strategy : MoveStrategy 클래스

 

 

  1. Context 는 구체적인 전략 중 하나에 대한 참조를 유지하며, 이 객체[구체적인 전략]와는 오직 전략 인터페이스를 통해서만 소통합니다."
  2. Strategy 인터페이스는 모든 구체적 전략에 공통적입니다. 이것은 Context가 전략을 실행하기 위해 사용하는 메소드를 선언합니다."
  3. Concrete Strategies 은 Context가 사용하는 알고리즘의 다양한 변형을 구현합니다.
  4. Context 는 알고리즘을 실행할 필요가 있을 때마다 Context와 연결[참조]된 전략 객체에 실행 메소드를 호출합니다. 컨텍스트는 자신이 어떤 종류의 전략을 사용하고 있는지, 또는 알고리즘이 어떻게 실행되는지 모릅니다.