행위 패턴(Behavioral Patterns) | 전략 (Strategy) 패턴
[index]
1. 전략 (Strategy) 패턴이란?
2. 전략 (Strategy) 패턴의 장점
3. 전략 (Strategy) 패턴의 단점
4. 전략 (Strategy) 패턴 적용 예시
5. 마무리
+ 디자인 패턴이 무엇인지 모른다면?
https://reveur1996.tistory.com/149
1. 전략 (Strategy) 패턴이란?
전략(Strategy) 패턴은 정책(Policy) 패턴이라고도 합니다. 객체지향 디자인에서 행동을 정의하고, 해당 행동을 각각의 알고리즘으로 캡슐화하여 상호 교체가 가능하도록 하는 패턴입니다. 이 패턴은 특정한 행동을 실행하기 위한 알고리즘을 정의하고, 이 알고리즘을 구체적인 구현으로부터 독립적으로 만듭니다.
객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴입니다.
전략 패턴의 구성 요소
- 컨텍스트(Context)
전략 객체를 사용하는 클라이언트에게 행동을 제공합니다. 또한 전략 객체를 설정하고, 전략 객체를 사용하여 원하는 행동을 수행합니다. - 전략 인터페이스
모든 전략의 동작을 정의하는 인터페이스입니다. 전략은 이 인터페이스를 구현하여 고유한 동작 구현을 제공합니다. - 구체적인 전략(Concrete Strategy)
전략 인터페이스를 구현하는 클래스입니다. 각 전략은 런타임 시 컨텍스트가 전환될 수 있는 특정 동작을 캡슐화합니다.
전략 패턴의 활용
- 알고리즘 선택
런타임 시 알고리즘을 선택할 수 있으므로 시스템은 특정 요구 사항에 따라 다양한 알고리즘을 상호 교환적으로 사용할 수 있습니다. 정렬, 검색 및 기타 알고리즘 작업에서 자주 사용됩니다. - 동작 변형
전략 패턴은 독립적으로 변경해야 하는 관련 동작 또는 알고리즘 모음이 있는 경우 각 알고리즘을 캡슐화하고 필요에 따라 전환하는 깔끔한 방법을 제공합니다. 특정 조건에 따라 다양한 동작을 구현해야 하는 애플리케이션에 이 기능이 도움이 될 수 있습니다. - 의사결정의 단순화
각 조건이나 의사결정 논리를 자체 전략으로 캡슐화하여 복잡한 조건문을 피하는 데 도움이 됩니다. 이렇게 하면 코드가 단순화되어 유지 관리가 더 용이해지고 이해하기 쉬워집니다. - 동적 런타임 동작
전략 패턴을 사용하면 런타임에 객체의 동작을 동적으로 변경할 수 있어 시스템에 유연성과 적응성을 제공할 수 있습니다.
2. 전략 (Strategy) 패턴의 장점
- 유연성과 확장성
전략 패턴은 알고리즘을 독립적으로 정의하고, 이를 컨텍스트에서 동적으로 교환할 수 있게 합니다. 이로써 시스템의 일부를 변경하더라도 다른 부분에 영향을 미치지 않아 유연성이 높아집니다. 새로운 전략을 추가하거나 기존 전략을 변경할 때에도 클라이언트 코드를 수정하지 않고 확장할 수 있습니다. - 코드 재사용성
각 전략은 독립적으로 구현되므로 다양한 컨텍스트에서 재사용이 가능합니다. 이는 중복 코드를 최소화하고 유지보수성을 향상시킵니다. - 행동의 독립성
각 전략은 특정 행동을 캡슐화하므로, 하나의 전략을 변경해도 다른 전략에는 영향을 주지 않습니다. 이는 각 전략의 독립성을 유지하면서 유연한 시스템을 제공합니다.
3. 전략 (Strategy) 패턴의 단점
- 코드 추가 복잡성
전략 패턴을 도입하면 클래스의 수가 증가하게 되고, 이로 인해 코드의 구조가 복잡해질 수 있습니다. 많은 전략이 존재하면 각각의 전략에 대한 클래스가 필요하므로 클래스의 수가 급격히 증가할 수 있습니다. - 클라이언트가 전략을 명시적으로 선택해야 함
클라이언트는 적절한 전략을 선택하여 전략 컨텍스트에 주입해주어야 합니다. 이 부분에서 개발자가 실수할 여지가 있습니다. 정확한 전략을 선택하지 않으면 원하는 행동을 얻을 수 없습니다. - 컨텍스트와 클라이언트의 상호작용 복잡성
클라이언트가 전략을 명시적으로 선택해야 하는 만큼 컨텍스트와 클라이언트 간의 상호작용이 복잡해질 수 있습니다. 특히, 컨텍스트와 클라이언트 간의 인터페이스 이해도가 필요하며, 이 부분에서 오류가 발생할 수 있습니다.
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);
- 캡슐화하고 상호 교환 가능하게 만들어야 하는 알고리즘이나 동작을 식별합니다.
- 필수 매개변수를 사용하는 단일 메서드 시그니처를 사용하여 동작을 나타내는 인터페이스를 정의합니다.
- 인터페이스에 정의된 동작의 특정 구현을 제공하는 구체적인 클래스를 구현합니다.
- 인터페이스에 대한 참조를 보유하고 필요할 때 해당 메서드를 호출하는 컨텍스트 클래스를 정의합니다.
- 런타임 시 구체적인 구현의 동적 교환을 허용하도록 컨텍스트 클래스를 수정합니다.
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
'Web Development > Design Patterns' 카테고리의 다른 글
[Design Patterns] 구조 패턴(Structural Patterns) | 프록시 (Proxy) 패턴 (0) | 2023.12.12 |
---|---|
[Design Patterns] 행위 패턴(Behavioral Patterns) | 옵저버(Observer) 패턴 (0) | 2023.12.12 |
[Design Patterns] 생성 패턴(Creational Patterns) | 팩토리 메서드 (Factory Method) 패턴 (0) | 2023.12.11 |
[Design Patterns] 생성 패턴(Creational Patterns) | 싱글톤(Singleton) 패턴 (0) | 2023.12.11 |
[디자인 패턴] 디자인 패턴이란? (0) | 2023.12.10 |