전략 패턴 Strategy

wjd15sheep·2024년 7월 9일
1

CS

목록 보기
3/9

실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 패턴 에 속합니다.

전략이란?
특정한 작업을 수행하기 위한 알고리즘이나 행의를 의미
알고리즘 : 특정 작업을 수행하기 위한 절차나 방법
행동 : 특정 상황에서 객체가 취할 수 있는 행동이나 동작

주로 알고리즘을 여러 개 정의하고, 각각의 알고리즘을 캡슐화하여 교체 가능하도록 만드는 것이 목적입니다.
이를 통해 클라이언트는 구체적인 알고리즘이나 전략에 의존하지 않고, 런타임 시에 필요에 따라 전략을 바꿀 수 있습니다.

전략 패턴은 여러 객체 지향 문법 기법들인, 객체지향 설계의 SOLID 원칙의 OCP원칙, DIP 원칙, 합성, 다형성, 캡슐화 등 OOP 기술들의 총 집합 버전

전략 패턴의 구조


1. 콘텍스트는 구상 전략 중 하나에 대한 참조를 유지하고 전략 인터페이스를 통해서만 이 객체와 통신합니다.
2. 전략 인터페이스는 모든 구상 전략에 공통이며, 콘텍스트가 전략을 실행하는 데 사용하하는 메서드를 선언합니다.
3. 구상 전략들은 콘텍스트가 사용하는 알고리즘의 다양한 변형들을 구현합니다.
4. 콘텍스트는 알고리즘을 실행해야 할 때마다 연결된 전략 객체의 실행 메서드를 호출합니다. 콘텍스트는 알고리즘이 어떻게 실행되는지와 자신이 어떤 유형의 전략과 함께 작동하는지를 모릅니다.
5. 클라이언트는 특정 전략 객체를 만들어 콘텍스트에 전달합니다. 콘텍스트는 클라이언트들이 런타임에 콘텍스트와 관련된 전략을 대체할 수 있도록 하는 세터(setter)를 노출합니다.

예시 코드

// 전략(추상화된 알고리즘)
interface IStrategy {
    void doSomething();
}

// 전략 알고리즘 A
class ConcreteStrateyA implements IStrategy {
    public void doSomething() {}
}

// 전략 알고리즘 B
class ConcreteStrateyB implements IStrategy {
    public void doSomething() {}
}

// 컨텍스트(전략 등록/실행)
class Context {
    IStrategy Strategy; // 전략 인터페이스를 합성(composition)
	
    // 전략 교체 메소드
    void setStrategy(IStrategy Strategy) {
        this.Strategy = Strategy;
    }
	
    // 전략 실행 메소드
    void doSomething() {
        this.Strategy.doSomething();
    }
}
  • IStrategy인터페이스는 전략이 구현해야 하는 메소드를 정의합니다.
  • ConcreteStrateAConcreateStragteyB 클래스는 각각 IStrategy를 구현하여 구체적인 앙ㄹ고리즘을 제공합니다.
  • Context 클래스는 현재 사용 중인 전략을 유지하며, 전략을 동적으로 변경하고 실행할 수 있는 메소드를 제공합니다.

이 코드 구조를 통해 클라이언트는 'Context' 객체에 원하는 전략을 설정하고, 동일한 방식으로 전략을 실행할 수 있습니다. 이는 코드의 유연성과 확장성을 높여줍니다.

장단점

장점

  • 런타임에 한 객체 내부에서 사용되는 알고리즘들을 교환할 수 있습니다.
  • 알고리즘을 사용하는 코드에서 알고리즘의 구현 세부 정보들을 고립할 수 있습니다.
  • 상속을 합성으로 대체할 수 있습니다.
  • 개방/폐쇄 원칙, 콘텍스트를 변경하지 않고도 새로운 전략들을 도입할 수 있습니다.

단점

  • 알고리즘이 몇 개밖에 되지 않고 거의 변하지 않는다면, 패턴과 함께 사용되는 새로운 클래스들과 인터페이스들로 프로그램을 지나치게 복잡하게 만들 이유가 없습니다.
  • 클라이언트들은 적절한 전략을 선택할 수 있도록 전략간의 차이점들을 알고 있어야 합니다.
  • 현대의 많은 프로그래밍 언어에는 익명 함수들의 집합 내에서 알고리즘의 다양한 번전들을 구현할 수 있는 함수형 지원이 있으며, 클래스들과 인터페이스들을 추가하여 코드의 부피를 늘리지 않으면서도 전략 개체를 사용했을 때와 똑같이 이러한 함수들을 사용할 수 있습니다.

다른 패턴과의 관계

  • 브리지, 상태, 전략 패턴은 매우 유사한 구조로 되어 있으며, 어댑터 패턴도 이들과 어느 정도 유사한 구조로 되어 있습니다. 패턴은 특정 방식으로 코드의 구조를 짜는 레시피에 불과하지 않습니다. 왜냐하면 패턴은 해결하는 문제를 다른 개발자에게 전달할 수 있기 때문입니다.
  • 커맨드전략 패턴은 비슷해 보일 수 있습니다. 왜냐하면 둘다 어떤 작업으로 객체를 매개변수화하는 데 사용할 수 있기 때문입니다. 그러나 이 둘의 의도는 매우 다릅니다.
    - 커맨드는 모든 작업을 객체로 변환할 수 있습니다. 커맨드들의 기록을 저장한 후 해당 커맨드들을 원격 서비스에 보내는 등의 작업을 가능하게 합니다.
    - 전략은 일반적으로 같은 작업을 수행하는 다양한 방법을 설명하므로 단일 콘텍스트 클래스 내에서 이러한 알고리즘을 교환할 수 있도록 합니다.
  • 데코레이터는 객체의 피부를 변경할 수 있고 전략 패턴은 객체의 내장을 변결할 수 있다고 비유할 수 있습니다.
  • 템플릿 메서드 상속을 기반으로 합니다. 이 메서드는 자식 클래스들에서 알고리즘의 부분들을 확장하여 변경할 수 있도록 합니다. 전략 패턴은 합성을 기반으로 합니다. 객체 수준에서 자동하므로 런타임에 행동을 전환할 수 있도록 합니다.
  • 상태전략의 확자응로 간주할 수 있습니다. 두 패턴은 합성을 기반으로 합니다. 전략 패턴은 이러한 객체들을 완전히 독립적으로 만들어 서로 인식하지 못하도록 만듭니다.

[참조]

profile
성장 위해 노력하는 웹 개발자 주니어

0개의 댓글