스트래티지 패턴(Strategy Pattern)
여러 알고리즘을 하나의 추상적인 접근점(인터페이스)을 만들어
이 접근점에서 서로 교환가능하도록 하는 패턴
또한
알고리즘을 정의하고 각각을 캡슐화하여 교환해서 사용가능 하도록 하는 패턴
이와 같이, 각 알고리즘은 캡슐로 정의되어 있고 필요할 때 서로 교환만 하기 때문에
알고리즘의 추가 및 수정에 편리합니다. 아래는 기본적인 Strategy 패턴을 나타냅니다.
Client는 Strategy를 가지고 있습니다. Strategy는 한개를 가질 수도 있고 여러개를 가질 수 있습니다.
Strategy 인터페이스를 통해 세 개의 Strategy(A,B,C)가 캡슐화되어 있음을 알 수 있습니다.
이와 같이 각 알고리즘은 캡슐화되어 분리되어 있고 만약 StrategyA에 수정이 필요하다면 해당 클래스만 수정하면 됩니다.
또한 새로운 Strategy가 추가될 경우 새로운 클래스를 생성하고 인터페이스에 연결해주기만 하면됩니다.
다른 클래스 및 인터페이스의 수정이 필요하지 않습니다.
여기서 인터페이스 Strategy는 여러 알고리즘을 교환할 수 있는 이 되며 사용자는 이 인터페이스를 통해 원하는 알고리즘을 선택할 수 있습니다
이해를 돕기 위해 아래 예제를 살펴보겠습니다.
예제 : 게임캐릭터와 무기 구현하기
게임 캐릭터와 무기를 구현해보겠습니다.
캐릭터는 여러 무기를 사용할 수 있고, 이 무기를 이용해 공격! 할 수 있습니다.
캐릭터는 Client가 되고 Weapon이라는 인터페이스를 통해 여러 무기종류에 접근할 수 있습니다. 이를 다이어그램으로 표현하면 아래와 같습니다.
게임캐릭터는 Weapon 인터페이스를 통해 여러 무기를 setting할 수 있습니다.
이제 무기를 추가해보겠습니다. 칼, 검 그리고 도끼를 추가해보겠습니다.
위와 같이 인터페이스에 여러 무기를 쉽게 추가할 수 있고, 게임캐릭터 역시 Weapon 인터페이스를 통해 각 무기를 사용할 수 있습니다.
여기서 각 무기는 캡슐이 되고 인터페이스 Weapon은 추상적인 접근점이 됩니다.
스트래티지 패턴을 이용하면 중복되는 코드를 최소화 할 수 있으며 각 알고리즘의 수정, 추가 및 삭제가 편리하다는 장점을 알 수 있습니다.
위 예제에 관련된 소스는 아래 주소에서 확인할 수 있습니다.
[https://github.com/choseungyoon/Design_Pattern/tree/master/Strategy_pattern]
본 글은 인프런의 자바 디자인패턴의 이해 강의를 참고하여 작성했습니다.
[https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/]