SW/디자인 패턴

디자인 패턴 : 스트래티지 디자인 패턴 : 정의, 구조, 예시

얇은생각 2019. 3. 31. 07:30
반응형

Strategy Design Pattern


의도 

알고리즘 패밀리를 정의하고, 각각을 캡슐화하여, 상호 교환할 수 있도록 합니다. 전략을 통해 알고리즘은 알고리즘을 사용하는 클라이언트와 독립적으로 변경될 수 있습니다.


인터페이스에서 추상화를 캡처하고 구현 세부 정보를 파생 클래스에 저장합니다.




문제

객체 지향 설계의 지배적인 전략 중 하나는 "open-closed 원칙"입니다.


그림에서는 기본 클래스에 인터페이스 세부 정보를 캡슐화하고 구현 세부 정보를 파생 클래스에 저장하는 방법을 보여 줍니다. 그런 다음 클라이언트는 인터페이스에 자신을 결합할 수 있으며, 힘들게 변경할 필요가 없습니다. 즉, 파생 클래스의 수가 변경될 때 영향을 주지 않으며, 파생 클래스의 구현이 변경될 때 영향을 주지 않습니다.


스트래티지(전략)


수년 동안 소프트웨어 커뮤니티가 지향하는 가치는 "응집력을 최대화하고 커플링을 최소화"하는 것입니다. 그림에 표시된 객체 지향 설계 방식은 모두 커플링을 최소화하는 것입니다. 클라이언트는 추상화에만 결합되어 있고, 그 추상화의 구체적인 구현은 아니기 때문에, 클라이언트는 "추상적 결합"을 하고 있다고 할 수 있습니다. 보다 일반적인 권고의 개체 지향적인 변형인 "결합 최소화"를 뜻합니다.


이 "추상적 커플링" 원리의 보다 일반적인 특성화는 "구현 방식이 아닌 인터페이스로의 프로그래밍"입니다.


고객은 인터페이스(또는 추상 기본 클래스)가 제공하는 "추가 수준의 방향성"을 선호해야 합니다. 인터페이스는 클라이언트가 구현하고자 하는 추상화를 캡처하고, 그 인터페이스의 구현은 효과적으로 숨겨집니다.




구조

인터페이스 엔티티는 추상적인 기본 클래스 또는 클라이언트의 메서드 시그니처 기대치를 나타낼 수 있습니다. 이전 사례에서 상속 계층은 동적 다형성을 나타냅니다. 후자의 경우 인터페이스 엔티티는 클라이언트에서 템플릿 코드를 나타내고 상속 계층은 정적 다형성을 나타냅니다.


스트래티지(전략)




예시

스트래티지(전략)는 서로 바꿔 사용할 수 있는 일련의 알고리즘을 정의합니다. 공항으로 가는 교통수단은 스트래티지의 한 예입니다. 자가용 운전, 택시, 공항 셔틀, 시내버스 또는 리무진 서비스와 같은 여러 가지 옵션이 있습니다. 일부 공항의 경우, 지하철과 헬리콥터가 공항으로의 교통 수단으로도 이용 가능합니다. 이러한 모든 교통수단은 여행자를 공항으로 데려갈 것이며, 그것들은 서로 바꿔서 사용할 수 있습니다. 여행자는 비용, 편의성 및 시간 간의 균형을 바탕으로 전략을 선택해야 합니다.


스트래티지(전략)



체크리스트

- 클라이언트가 "가변점"을 통해 액세스하기를 원하는 알고리즘(즉, 동작)을 식별합니다.

- 인터페이스에서 해당 알고리즘의 서명을 지정합니다.

- 파생 클래스에서 대체 구현 세부 정보를 수집합니다.

- 알고리즘의 클라이언트는 인터페이스와 결합합니다.




관련 내용

- 스트래티지(전략)는 세분성을 제외하고는 템플릿 방법과 같습니다.

- 상태는 그 의도를 제외하고 스트래티지와 같습니다.

스트래티지(전략)을 통해 개체의 내부를 변경할 수 있습니다. 데코레이터를 사용하면 피부를 바꿀 수 있습니다.

- State, Strategy, Bridge(및 일부 어댑터)는 유사한 솔루션 구조를 가지고 있습니다. 모두 '핸들/몸통' 관용어의 요소를 공유합니다. 이것들은 각각 의도가 다르며, 다른 문제들을 해결합니다.

반응형