| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 설탕 배달
- Servlet
- Spring
- 완도산회
- 2020 KAKAO BLIND
- 서블릿
- mvc
- 스프링 MVC
- BFS
- 스프링
- 맛집
- 맛집 투어
- 1로 만들기
- 2638
- 프로그래머스
- HTTP API
- 알고리즘
- 2589
- 호유동
- 포두부 보쌈
- 쓰레드 풀
- 동적 프로그래밍
- 고모네 콩탕
- dp
- 2839
- 문자열 압축
- 다이나믹 프로그래밍
- 투어
- 백준
- 양꼬치
- Today
- Total
프로그래밍 공방
Strategy Pattern : 전략 패턴 본문
Strategy Pattern : 전략 패턴
실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴
알고리즘군(분리할 행동 양식) 을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만드는 패턴이다.
전략 패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

전략 패턴의 원칙
1. 클래스에서 달라지는 부분을 찾아내고 달라지지 않는 부분으로부터 분리시킨다.
바뀌는 부분은 따로 뽑아서 캡슐화한다. 그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은채로 그 부분만 고치거나 확장할 수 있다.

달라지는 부분을 클래스에서 분리해서 각 부분을 나타낼 클래스 집합을 새로 만든다.
클래스 집합을 디자인 하는 법
- 최대한 유연하게
- 기존 클래스의 인스턴스에 할당 수 있어야 한다(해당 부분으로 초기화 등)
- 동적으로 바꿀 수 있다면 더 좋다 => setter
2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
즉. 분리할 부분들은 인터페이스로 표현하고 행동을 구현할 때 이 인터페이스들을 구현하도록 한다.

"인터페이스에 맞춰서 프로그래밍 한다"의 의미 ( 자바의 Interface가 아니다. )
즉, 실제 실행시에 쓰이는 객체가 코드에 의해서 고정되지 않도록, 어떤 상위 형식에 맞게 프로그래밍 함으로써 다형성을 활용해야 한다는 것을 말한다.
"상위 형식에 맞춰서 프로그래밍한다."
- 클라이언트에 변수를 선언할 때는 추상 클래스나 인터페이스 같은 상위 형식으로 선언해야 한다.
* 이런 식으로 디자인 하면 다른 형식의 객체에서도 해당 행동을 재사용할 수 있다.
또한, 기존 행동 클래스를 수정하거나 기존 클래스를 전혀 건드리지 않고도 새로운 행동을 추가할 수 있다.
* 기존의 클래스에서 분리한 행동들을 기존 클래스에서 정의한 메소드를 써서 구현하지 않고 다른 클래스에 위임할 수 있다.
How..?
1. 기존 클래스에 분리한 행동 집합의 가장 상위 인터페이스 형식의 인스턴스 변수를 추가한다.
2. 분리한 행동을 수행하는 메소드를 인터페이스에 의해 참조되는 객체에서 실행하게 한다.
이렇게 하면 수행하는 객체의 종류는 신경쓰지 않아도 된다.
"A는 B이다" 보다 "A에는 B가 있다"가 나을 수 있다.
어떠한 행동을 상속받는 것보다. 올바른 행동 객체로 구성 됨(행동을 변수로서 가지고 있는 것)으로써 행동을 부여받게 된다.
3. 상속 보다는 구성을 이용한다.
구성을 이용하면 상속에 비해 시스템의 유연성을 크게 증가시킬 수 있다.
- 분리할 부분을 클래스의 집합으로 캡슐화
- 구성 요소로 사용하는 객체에서 올바른 인터페이스를 구현하기만 하면 실행시에 동적으로 변경 가능