Object) [F2]Trigger Strategy to Factory
조건에 대한 전략객체를, 1번째 전략객체 담당 Factory에게 위임하기
📜 제목으로 보기
Trigger전략객체2의 로직을 위임된(주입되는) factory에게 위임하기
-
현재 DiscountPolicy in step5 시작는 2개의 전략객체를 받기(condition, trigger) + 주입(policy, action)받아 사용중
- 전략객체 Calculator를 구상Factory로 받아서 사용하며
- trigger전략객체 DiscountCondition은 외부에서 setter로 받고 -> 내부에서 호출해서 사용한다.


-
trigger기능을 가진 condition전략객체를
위임된 Factory에서받기+제공 책임을 위임해보자.
-
사실상의 구상체들인 구상Factory들을 다시 strategy패키지로 이동했다.- 인터페이스는 전략인터페이스이나 전략객체 대신 구상Factory들이 주입됬었다.

-
DiscountPolicy내에서
필드에 받아진 trigger전략객체들-> for문을 돌면서 trigger전략메서드를 사용하는 상태이므로2번째 전략객체들 묶음을 getter로 제공하는 기능을 factory에 추가해야한다.-
받을 2번재 전략객체가 1개면, factory에서 생성 -> 전략메서드까지 호출하는 메서드를 만들면 되는데, 현재는
사용처에 전략객체들 묶음을 먼저 제공해야이후 전략메서드를 사용할 수 있는 상태기 때문에- factory가 내수용 받기메서드로 받아놓을
전략객체 묶음을 제공하는 기능을 추상메서드로 가져햐아한다. - 기존: discountpolicy내에서 필드로 받아서
필드(보라색)으로 사용
- 수정: factory가 (내부에서 받아서) getter메서드로 제공
- factory가 내수용 받기메서드로 받아놓을
-
내부에서 보라색필드로 꺼내서 사용하는 로직을 옮긴다?-
로직이 옮겨간 곳에서는
getter로 제공해야한다. -
로직이 옮겨간 곳에서는 필드의 변수형에 맞는 컬렉션으로 응답해줘야한다.

-
-
Factory변수에서 생성해주면, 추상체인 Calculator에 추상메서드로 올라간다.
- 1개 전략 인터페이스에 2개의 메서드가 정의된 상태로, 중간추상층의 추가가 요구 된다.

- 1개 전략 인터페이스에 2개의 메서드가 정의된 상태로, 중간추상층의 추가가 요구 된다.
-
-
전략 인터페이스에 1개의 메서드만 갖으며 &
최종구상체인 구상Factory들은 2가지 기능을 가지도록중간추상층(2번째 전략객체의 인터페이스)를 추가한다-
인터페이스를
extends하여 중간추상층 인터페이스를 만든다.
-
현재는 네이밍이 Calculator(전략객체) - AmountCalculatorFactory(구상Factory) 상태인데
- 중간 추상층은 trigger관련이므로 action + trigger의 의미를 다 담는
policy+Factory로 작성하고1개 추상메서드를 위임한다.
- 중간 추상층은 trigger관련이므로 action + trigger의 의미를 다 담는

-
-
최종구상층인 구상Factory들은
상위추상층이 아니라중간추상층을 imple하여2개의 추상메서드를 구상하도록 상태를 만든다.
-
전략객체를 사용하는 DiscountPolicy에서는
2개를 구상하는 최종구상Factory를 포용할 수 있는 중간추상체인PolicyFactory를 추상체 변수로 사용하도록 변경한다.

-
전략객체묶음을 제공하는 기능은 이관(안에서 필드 -> factory.getter)되었으니
전략객체 묶음 받기를이관해서 내수용으로 정의해줘야 제공getter도 정상작동한다-
제공기능을 구현하는 곳인 구상Factory내에서 제공 기능을 작성하면서
필요한 재료들을 받기기능으로 구현하면 된다.- return 제공 변수(빨간색)
- 내부에 가진 것을 응답하니 field
- 내부에 field에 받기기능
- 1개를 객체생성과 동시에 받는다면 생성자주입
-
생성이후에 받는 것이라면, null초기화 필드에 setter 공짜로 생성
- 여러개를 받는 것이라면, null필드를 빈컬렉션으로 변경
- setter메서드의 이름을 addXXXX로 변경 + 인자를 객체1개로 변경

-
나머지 구상체들도 제공기능을 위한, 받기기능을 구현해준다.

-
-
DiscountPolicy에서는 위임된 전략객체 받는기능을 제거한다.

-
Main에서 policy적용을 위한 객체 생성시
- 기존 DiscountPolicy에 trigger전략객체인 Conditions를 추가 by 받기기능
- 변경 -> Policy 전략 구상층인
구상Factory에타 전략객체 condition을 추가 by 받기능


-
factory에 getter로 인한, 전략객체 사용처(DiscountPolicy)의 디미터법칙 위반 확인


- factory의 기능이 getter기능이라면, 전략객체 사용처에서 내에서
지역변수로 받거나 or getter.B()로 체이닝하거나 or getter를 for문으로 하나씩 돌릴 때, 응답을 받는 순간의존성이 추가된다. but 의존성을 낮추려고 factory를 쓰는 것이다.- 사실상 지역변수로 받거나 or 체이닝하거나 or for문에 돌릴 때,
factory만 알아야할, 보호받아야할, 변하지 않는 [전략객체 사용처]가 의존성이 추가되므로시켜서 = 위임해서제거해야한다.
- 사실상 지역변수로 받거나 or 체이닝하거나 or for문에 돌릴 때,
-
구상Factory마다 모두 시키는 것이 적용되어야하므로
구상층 직전의 추상층이자인터페이스 변수로 사용되는PolicyFactory내부에default 메서드로서getter로직을 위임시켜야한다- getter로직을 위임할 땐, 기존
객체.getter()를 안으로 가지고 들어가getter()으로서 사용하면서.B()에 해당하는 메서드 내부에 다 포함시켜야한다- 예를 들어 객체.getter().B() -> 객체.B()로 변경 뒤, 내부에서는 getter()로 사용
- getter로직을 위임할 땐, 기존
전략객체를 내부에서 받아 사용하는 class는, 변화가 없고 의존성이 낮아야한다.
- factory의 기능이 getter기능이라면, 전략객체 사용처에서 내에서
-
discountPolicy내부의 calculateFee()는
전략객체factory.calculateFee(fee)만 남기고, 전부 factory의 인터페이스 내부로 위임되어야한다.-
F6으로 옮기면,내부에 사용된 객체class 중 택1하면서통째로 다 옮겨버리니,옮기기 전에 복사해서 틀을 짜놓고 옮긴다.- 응답메서드이므로
return factory.calculateFee(fee)를 남겨놓고 옮긴다.- 이 때, 옮겨질 defatult 메서드를 활용하는 코드다.
default 메서드는 내부에서 구상factory들이 구현해야하는 2가지 전략메서드를 내부에서 사용한 method다.
- 추상체이자 interface로 옮기면 자동으로
default메서드로 옮겨진다.
- 응답메서드이므로


- 기존에 사용된
추상체.추상메서드()를추상체 내부에선 상위추상층의 추상(전략)메서드를 그대로 내수용으로써 사용해도 deafult 메서드라면 괜찮은가보다. - discountPolicy의 context를 사용하지 않았는데, F6으로 따라온 파라미터를 제거한다.

-
결과적으로
DiscountPolicy는 전략메서드2개를 내수용으로 사용하는 deafault메서드 1개를 호출해서 사용하게 된다.
-
2개 이상의 전략메서드를 포함하는
추상체 변수에게 공통 로직을 위임할 때,인터페이스의 default메소드로 위임되며,내부에서는 내려받은 전략메서드를 내수용으로서 편하게 사용해서 정의된다.

-