PRACTICE) 여러 전략객체를 적용하는 방법
적용대상 <-> 전략패턴 사이에 전략주입 구상클래스 + setNext 받기체이닝
📜 제목으로 보기
여러 전략객체 적용하기
설명
- 사실, 여러 전략객체들을 적용하려다보니
- 원래는 각 전략객체마다
next
의 다음 타자 전략객체를 소지하고 있어야하며 - next
필드
+ 다음 타자전략객체들을 재귀형식으로 호출해줄공통로직
에 의해템플릿메소드패턴
의 추상클래스가 전략인터페이스를 대체하여 바뀌며 - 좋은 상속은
합성
으로 다시 변경되어서구상클래스화
+전략인페 추가
+전략객체들
형태가 된다. -
이 때,
추상클래스-상속
에서 ->전략주입 구상-합성
으로 변경할 때 로직이 변경되는데-
다음 타자
next
소유 +return null터미네이팅 + next로 전략메서드()를 재귀호출
로직을- 전체 타자
컬렉선
소유 +forloop 누적 연산
으로 바뀌고
- 전체 타자
-
다음 타자 [받기 +
<추상체this>
(현재구상체) 반환]의외부 <타자별> 체이닝 받기
로직을첫번째 타자 생성자 필수 add받기 + 2번째부터 [add받기 + <구상체this반환>]의 외부 <자신의 연속> 체이닝 받기
- 추상체this반환 받기기능은, 현재구상체가 반환되어 다음 타자로 넘어간다?
- 구상체this반환 받기기능은, 받아서 상태가 달라진 현재상태의 객체를 다시 반환하여, 체이닝해서 연속해서 받기가 가능해진다.
-
다음 타자
- 원래는 각 전략객체마다
실습
정잭적용객체 <-> 전략객체들 사이에 [전략주입 구상클래스]의 다리를 만든다.
- 단순히 전략메서드만 적용하는 것이 아니라
- 전략조건을 여러개 받아야할 때, 중간에 구상클래스를 둔다.
- 여러 전략객체들을 모아 한번에 적용할 때, 중간에 구상클래스를 둔다.
- 여러 카테고리의 전략이 필요할 때, 중간에 구상클래스를 둔다.
여러 전략을 받는, 전략주입 구상클래스는 return this가 달린 add받기기능인 [외부 체이닝 받기기능]을 가진다.
- 받아서 변화된 상태의 자신을 반환하면, 또다시 받기가 가능하다.
-
CalculatorBasedOnCalls
는 전략주입 구상클래스로서-
첫번째 전략객체는 생성자 주입으로 인한
필수 받기 to 컬렉션
-
2번재 전략객체부터는
setNext()의 받기 + this반환
의외부 연속 체이닝 받기 to 컬렉션
을 적용할 것이다.- my) 받기기능을 체이닝으로 하려면 setter느낌이지만,
받고나서 return this
로 인해상태변화된 나 자신을 반환
해준다.
- my) 받기기능을 체이닝으로 하려면 setter느낌이지만,
-
받아서 변화된 나를 반환해주는 setNext()를 정의하면 외부에서 체이닝해서 계속 받을 수 있다.
-
적용객체에 주입되어, 적용대상 객체context를 [여러 전략이 적용되어 누적되서 반환될 것의 초기값]을 전달받은 뒤, 내부에 소유한 여러 전략객체를 forloop로 돌면서 여러번 전략메서드를 누적 호출한 뒤 변화된 객체를 최종 반환한다.
전략이 주입되는 적용대상 객체 Plan
이 직접 계산해서외부에 전략으로 계산된 요금을 제공
한다.- 전략 객체가
누적연산한다면, 그 초기값을 건네
주어 ->누적된 값을 반환받는 것이 context공유
의 한 부분이다.
-
전략적용 객체 Plan은, 전략주입 구상클래스를 주입받은 것을 활용해서 내부에서 처리를 해주는데, plan 내부에 있는
적용대상 객체(여기선 객체에 적용하진 x)
or누적연산이라면 초기값(Money.ZERO)
+계산시 필요한 정보(calls)
을를 전략주입 구상클래스에게 적용하라고 건네준다.-
요금계산 적용객체는
계산정보 calls
와누적 연산 초기값
을 건네준다.-
초기값을 건네주고, 누적연산을 받는 것이야말로 객체context 공유다
- 값을 건네주고 업데이트된 상태값을 받는다.
- 값을 건네주고 쌩뚱맞은 값을 반환받거나 반환안받으면 객체context공유가 아님.
-
초기값을 건네주고, 누적연산을 받는 것이야말로 객체context 공유다
-
요금계산 적용객체는
-
필요한 부수재료들을 만들어준다.
- List컬렉션은 index에 값을 사용하므로 값context다
- HashSet은 순서가 보장되며 + 중복검증해주며 + 객체로 꺼내고 넣는 객체context라서 적극 활용한다.
-
전략주입 구상클래스에서 여러 전략객체들을 forloop돌면서 누적 적용한다.
- 개별 전략메서드마다 계산한 값을
파라미터로 온 초기값을 for문위 누적변수(지역변수) 삼아서 누적
해주고, 반환해준다.- 넘어가는 초기값의 type은 Money의 VO로서 값객체다.
- 개별 전략메서드마다 계산한 값을