본문 바로가기
Web Development/Design Patterns

[Design Patterns] 행위 패턴(Behavioral Patterns) | 전략 (Strategy) 패턴.

by Krystal K 2023. 12. 12.

행위 패턴(Behavioral Patterns) | 전략 (Strategy) 패턴 

[index]
1. 전략 (Strategy) 패턴이란?
2. 전략 (Strategy  패턴의 장점
3. 전략 (Strategy  패턴의 단점
4. 전략 (Strategy  패턴 적용 예시
5. 마무리


+ 디자인 패턴이 무엇인지 모른다면?
https://reveur1996.tistory.com/149

[디자인 패턴] 디자인 패턴이란?

디자인 패턴이란? 1. 디자인 패턴이란? 2. 디자인 패턴 구조 3. 왜 디자인 패턴을 알아야할까? 4. 디자인 패턴에 대한 부정적인 시각 5. 디자인 패턴의 분류 6.마무리 1. 디자인 패턴이란? 패턴은 알

reveur1996.tistory.com

 

1. 전략 (Strategy) 패턴이란?

전략(Strategy) 패턴은 정책(Policy) 패턴이라고도 합니다. 객체지향 디자인에서 행동을 정의하고, 해당 행동을 각각의 알고리즘으로 캡슐화하여 상호 교체가 가능하도록 하는 패턴입니다. 이 패턴은 특정한 행동을 실행하기 위한 알고리즘을 정의하고, 이 알고리즘을 구체적인 구현으로부터 독립적으로 만듭니다.
 
객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴입니다. 
 

전략 패턴의 구성 요소

  1. 컨텍스트(Context)
    전략 객체를 사용하는 클라이언트에게 행동을 제공합니다. 또한 전략 객체를 설정하고, 전략 객체를 사용하여 원하는 행동을 수행합니다.
  2. 전략 인터페이스
    모든 전략의 동작을 정의하는 인터페이스입니다. 전략은 이 인터페이스를 구현하여 고유한 동작 구현을 제공합니다.
  3. 구체적인 전략(Concrete Strategy)
    전략 인터페이스를 구현하는 클래스입니다. 각 전략은 런타임 시 컨텍스트가 전환될 수 있는 특정 동작을 캡슐화합니다.

 

전략 패턴의 활용

  • 알고리즘 선택
    런타임 시 알고리즘을 선택할 수 있으므로 시스템은 특정 요구 사항에 따라 다양한 알고리즘을 상호 교환적으로 사용할 수 있습니다. 정렬, 검색 및 기타 알고리즘 작업에서 자주 사용됩니다.

  • 동작 변형
    전략 패턴은 독립적으로 변경해야 하는 관련 동작 또는 알고리즘 모음이 있는 경우 각 알고리즘을 캡슐화하고 필요에 따라 전환하는 깔끔한 방법을 제공합니다. 특정 조건에 따라 다양한 동작을 구현해야 하는 애플리케이션에 이 기능이 도움이 될 수 있습니다.

  •  의사결정의 단순화
    각 조건이나 의사결정 논리를 자체 전략으로 캡슐화하여 복잡한 조건문을 피하는 데 도움이 됩니다. 이렇게 하면 코드가 단순화되어 유지 관리가 더 용이해지고 이해하기 쉬워집니다.

  • 동적 런타임 동작
    전략 패턴을 사용하면 런타임에 객체의 동작을 동적으로 변경할 수 있어 시스템에 유연성과 적응성을 제공할 수 있습니다.

 

2. 전략 (Strategy  패턴의 장점

  1. 유연성과 확장성
    전략 패턴은 알고리즘을 독립적으로 정의하고, 이를 컨텍스트에서 동적으로 교환할 수 있게 합니다. 이로써 시스템의 일부를 변경하더라도 다른 부분에 영향을 미치지 않아 유연성이 높아집니다. 새로운 전략을 추가하거나 기존 전략을 변경할 때에도 클라이언트 코드를 수정하지 않고 확장할 수 있습니다.

  2. 코드 재사용성
    각 전략은 독립적으로 구현되므로 다양한 컨텍스트에서 재사용이 가능합니다. 이는 중복 코드를 최소화하고 유지보수성을 향상시킵니다.

  3. 행동의 독립성
    각 전략은 특정 행동을 캡슐화하므로, 하나의 전략을 변경해도 다른 전략에는 영향을 주지 않습니다. 이는 각 전략의 독립성을 유지하면서 유연한 시스템을 제공합니다.

 

3. 전략 (Strategy  패턴의 단점

  1. 코드 추가 복잡성
    전략 패턴을 도입하면 클래스의 수가 증가하게 되고, 이로 인해 코드의 구조가 복잡해질 수 있습니다. 많은 전략이 존재하면 각각의 전략에 대한 클래스가 필요하므로 클래스의 수가 급격히 증가할 수 있습니다.

  2. 클라이언트가 전략을 명시적으로 선택해야 함
    클라이언트는 적절한 전략을 선택하여 전략 컨텍스트에 주입해주어야 합니다. 이 부분에서 개발자가 실수할 여지가 있습니다. 정확한 전략을 선택하지 않으면 원하는 행동을 얻을 수 없습니다.

  3. 컨텍스트와 클라이언트의 상호작용 복잡성
    클라이언트가 전략을 명시적으로 선택해야 하는 만큼 컨텍스트와 클라이언트 간의 상호작용이 복잡해질 수 있습니다. 특히, 컨텍스트와 클라이언트 간의 인터페이스 이해도가 필요하며, 이 부분에서 오류가 발생할 수 있습니다.

 

4. 전략 (Strategy  패턴 적용 예시

// 전략 인터페이스
class SortingStrategy {
  sort(data) {
    // 하위 클래스에서 구현할 메서드
  }
}

// 구체적인 전략 클래스들
class QuickSort extends SortingStrategy {
  sort(data) {
    console.log("QuickSort: ", data.sort((a, b) => a - b));
  }
}

class MergeSort extends SortingStrategy {
  sort(data) {
    console.log("MergeSort: ", data.sort((a, b) => a - b));
  }
}

// 전략을 사용하는 컨텍스트 클래스
class SorterContext {
  constructor(strategy) {
    this.strategy = strategy;
  }

  setStrategy(strategy) {
    this.strategy = strategy;
  }

  applyStrategy(data) {
    this.strategy.sort(data);
  }
}

// 예시 사용
const sorterContext = new SorterContext(new QuickSort());

const dataToSort = [5, 2, 8, 1, 7];
sorterContext.applyStrategy(dataToSort);

// 전략을 동적으로 변경
sorterContext.setStrategy(new MergeSort());
sorterContext.applyStrategy(dataToSort);
  1. 캡슐화하고 상호 교환 가능하게 만들어야 하는 알고리즘이나 동작을 식별합니다.
  2. 필수 매개변수를 사용하는 단일 메서드 시그니처를 사용하여 동작을 나타내는 인터페이스를 정의합니다.
  3. 인터페이스에 정의된 동작의 특정 구현을 제공하는 구체적인 클래스를 구현합니다.
  4. 인터페이스에 대한 참조를 보유하고 필요할 때 해당 메서드를 호출하는 컨텍스트 클래스를 정의합니다.
  5. 런타임 시 구체적인 구현의 동적 교환을 허용하도록 컨텍스트 클래스를 수정합니다.

 

5. 마무리

전략 패턴은 유연성을 제공하면서도 코드를 깔끔하게 유지할 수 있는 강력한 디자인 패턴 중 하나입니다. 객체 지향 프로그래밍에서 변화에 대응하기 위한 유연성은 매우 중요한데, 전략 패턴은 이를 위한 효과적인 도구로 사용됩니다. 전략 패턴의 핵심은 알고리즘을 캡슐화하고, 이를 컨텍스트에서 동적으로 교체할 수 있다는 점에 있습니다. 이는 애플리케이션이 다양한 알고리즘을 사용하거나 변경이 필요한 상황에서 유용합니다. 또한 이 패턴을 사용하면 코드의 재사용성이 증가하고, 각 알고리즘이 독립적으로 테스트 및 유지보수가 가능하다는 장점이 있습니다.
 
그러나 모든 디자인 패턴처럼 전략 패턴에도 몇 가지 고려해야 할 단점이 존재합니다. 클래스의 수가 증가하고, 각각의 전략 클래스를 구현해야 하므로 코드의 양이 늘어날 수 있습니다. 또한 클라이언트가 전략을 선택하는 일은 책임을 넘겨주는 것이기 때문에 클라이언트 코드가 자체적으로 전략을 선택하는 로직을 가지게 되는데, 이로 인해 복잡성이 증가할 수 있습니다.
 
전략 패턴을 사용할 때에는 각각의 전략이 독립적이고 서로 교체 가능한지, 또한 꼭 필요한 상황에서만 사용해야 한다는 것을 주의해야 합니다. 적절한 상황에서 사용된다면 전략 패턴은 애플리케이션의 디자인을 개선하고 유지보수성을 높일 수 있는 강력한 기법입니다.


참고문헌
https://www.freecodecamp.org/news/a-beginners-guide-to-the-strategy-design-pattern/
https://www.geeksforgeeks.org/strategy-method-javascript-design-pattern/
https://devnest.tistory.com/3
https://velog.io/@lky5697/the-power-of-strategy-design-pattern-in-javascript
https://dev.to/carlillo/design-patterns---strategy-pattern-in-javascript-2hg3
https://www.dofactory.com/javascript/design-patterns/strategy

728x90