1.1.3 전략패턴
정책 패턴이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.
알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 사용할 수 있게 해줌
즉, 어떤 일을 수행하는 알고리즘이 여러가지 일때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우에 적합한 패턴이다.
전략 패턴 특징
전략 패턴 사용 시기
- 전략 알고리즘의 여러 버전 또는 변형이 필요할 때 클래스화를 통해 관리
- 알고리즘 코드가 노출되어서는 안 되는 데이터에 액세스 하거나 데이터를 활용할 때 (캡슐화)
- 알고리즘의 동작이 런타임에 실시간으로 교체 되어야 할때
전략 패턴 주의점
- 알고리즘이 많아질수록 관리해야할 객체의 수가 늘어난다는 단점이 있다.
- 만일 어플리케이션 특성이 알고리즘이 많지 않고 자주 변경되지 않는다면, 새로운 클래스와 인터페이스를 만들어 프로그램을 복잡하게 만들 이유가 없다.
- 개발자는 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다. (복잡도 ↑)
가장 좋은 방법은 변경시키고자 하는 행위(전략)를 직접 넘겨주는 것이다.
예를 들어, 한 여행사 기업에 여행 플랜들이 있다. 이를 여행플랜 A, 여행플랜 B 라고 생각해보자.
각 여행플랜에 따른 plan 클래스를 생성하고, 해당 여행플랜의 여행플랜에 대한 정보를 저장한다.
이런식으로 캡슐화를 하는 이유는 다른 정보들(여행 플랜)이 추가적으로 확장될 경우를 고려한 설계이기 때문이다.
public interface TravlePlan {
public void tourPlan();
}
public class Aplan implements TravlePlan{
public void tourPlan() {
system.out.println("일본여행");
}
}
public class Bplan implements TravlePlan{
public void tourPlan() {
system.out.println("중국여행");
}
}
그런 뒤, 각 여행사의 여행 플랜을 정의한다. 여행플랜을 직접 정의하지 않고, 어떤 여행플랜을 사용할 것인지 설정하여 그 여행플랜을 사용하도록 한다.
public class TourAgency{
private TravlePlan travlePlan;
public void plan() {
travlePlan.tourPlan();
}
public void setTourplan(TravlePlan travlePlan) {
this.travlePlan = travlePlan;
}
}
public class Aagent extends TourAgent {
}
public class Bagent extends TourAgent {
}
public class Client {
public static void main(String args[]) {
TourAgency Aagent = new Aagent();
TourAgency Bagent = new Bagent();
Aagent.setTourPlan(new Aplan);
Bagent.setTourPlan(new Bplan);
Aagent.plan(); // 일본여행
Bagent.plan(); // 중국여행
}
}
전략 패턴에선 인스턴스를 넣어 알고리즘을 수행하도록 한 것이다.
이런식으로 구성하면 좋은 점은 나중에 다른 여행플랜들을 추가로 등록할때, 코드의 수정없이 빠르게 기능을 확장할 수 있다는 장점이 있다. (클래스를 추가하고 implements 해주면 끝)
결국 객체 지향 프로그래밍의 핵심인 유지보수를 용이하게 하기위해, 약간 복잡하더라도 이러한 패턴을 적용하여 프로그램을 구성해 나가는 것이다.
가독성과 유지 보수성에 유리하다
- 만약 패키지 전략을 사용하지 않았다면, 상황에 따라 객체가 끊임없이 늘어날 수 있다.
- 패키지 전략을 사용하면, 필요한 클래스만 만들어서 변화에 따라 설정만 해주면 되기 때문에 객체의 수가 줄어들게 되어 유지 보수성이 좋아진다.
OCP (개방폐쇄의 원칙) : 변경엔 닫혀있고 확장엔 열려있는 객체지향 원칙이 실현된다.
- 다른 행동 및 전략이 추가된다고 해도 기존의 코드는 변경하지 않고 확장이 가능하다.
출처: https://inpa.tistory.com/entry/GOF-💠-전략Strategy-패턴-제대로-배워보자 [Inpa Dev 👨💻:티스토리]
https://tjdtls690.github.io/studycontents/java/2022-09-13-strategy_pattern01/
'CS' 카테고리의 다른 글
[디자인 패턴] 싱글톤 패턴 (singleton pattern) (0) | 2024.08.15 |
---|