9. Delegation의 구조
Delegator Delegate
usee
user
public class Delegator {
public void do() {
delegate.some();
}
}
10. Delegation …
• 클래스 기능을 확장하고 재사용하는 방법
– 상속에 비해 확장 유연
– 런타임에 기능의 교체가 필요한 경우 유용
• 좋은 설계의 바탕
• 다양한 패턴의 기본
– Decorator, Proxy, Strategy, …
11. 예 - 콜렉션의 처리
상속 위임
List
LuggageCompartment List
-pieces : List
LuggageCompartment
class LuggageCompartment class LuggageCompartment {
extends List { List pieces;
void add(Luggage piece) {
... void add(Luggage piece) {
super.add(piece); ...
} pieces.add(piece);
} }
}
13. Strategy: 기능 정의, 구현 변경 가능
어떻게 돈을 벌지?
기능: 돈을 벌다
구현안1: 대성을 패밀리에 출현
구현안2: 태양을 솔로로 데뷔
구현안3: 단체로 교복 광고
14. 변이를 조건문으로 구현한다면…
if (conditionA) {
… // 알고리즘1 구현
코드가 복잡해짐
} else if (conditionB) {
특정 런타임에 사용되지 않는 코드 포함
… // 알고리즘2 구현
신규 알고리즘 추가의 어려움
} else if (conditionC) {
… // 알고리즘3 구현
}
15. Strategy 패턴의 구조
Context Strategy
EntertainmentCompany MakingMoneyPlan
+setMoneyPlan(plan : MakingMoneyPlan) +makeMoney()
Solo Famiyly AD
-person
Strategy의 구현체
16. Strategy 적용 결과
• 동일한 기능을 제공하는 알고리즘의 집합 정의
• Delegation으로 상속 대체
• 조건문 제거
– Context 클래스 크기가 작아짐
• Context 변경 없이 Strategy 교체 가능
– 이슈: 누가 Strategy 구현체를 Context에 설정할지
• DI(dependecy injection)으로 설정 (예, 스프링)
• 또는 Context를 사용할 객체가 설정