📜 제목으로 보기

여러 전략객체 적용하기

설명

  • 사실, 여러 전략객체들을 적용하려다보니
    • 원래는 각 전략객체마다 next의 다음 타자 전략객체를 소지하고 있어야하며
    • next 필드 + 다음 타자전략객체들을 재귀형식으로 호출해줄 공통로직에 의해 템플릿메소드패턴의 추상클래스가 전략인터페이스를 대체하여 바뀌며
    • 좋은 상속은 합성으로 다시 변경되어서 구상클래스화 + 전략인페 추가+ 전략객체들형태가 된다.
    • 이 때, 추상클래스-상속에서 -> 전략주입 구상-합성으로 변경할 때 로직이 변경되는데
      1. 다음 타자next소유 + return null터미네이팅 + next로 전략메서드()를 재귀호출로직을
        • 전체 타자 컬렉선 소유 + forloop 누적 연산으로 바뀌고
      2. 다음 타자 [받기 + <추상체this>(현재구상체) 반환]의 외부 <타자별> 체이닝 받기로직을
        • 첫번째 타자 생성자 필수 add받기 + 2번째부터 [add받기 + <구상체this반환>]의 외부 <자신의 연속> 체이닝 받기
        • 추상체this반환 받기기능은, 현재구상체가 반환되어 다음 타자로 넘어간다?
        • 구상체this반환 받기기능은, 받아서 상태가 달라진 현재상태의 객체를 다시 반환하여, 체이닝해서 연속해서 받기가 가능해진다.

실습

정잭적용객체 <-> 전략객체들 사이에 [전략주입 구상클래스]의 다리를 만든다.
  • 단순히 전략메서드만 적용하는 것이 아니라
    1. 전략조건을 여러개 받아야할 때, 중간에 구상클래스를 둔다.
    2. 여러 전략객체들을 모아 한번에 적용할 때, 중간에 구상클래스를 둔다.
    3. 여러 카테고리의 전략이 필요할 때, 중간에 구상클래스를 둔다.

image-20220708000059341

여러 전략을 받는, 전략주입 구상클래스는 return this가 달린 add받기기능인 [외부 체이닝 받기기능]을 가진다.
  • 받아서 변화된 상태의 자신을 반환하면, 또다시 받기가 가능하다.
  1. CalculatorBasedOnCalls전략주입 구상클래스로서

    1. 첫번째 전략객체는 생성자 주입으로 인한 필수 받기 to 컬렉션

      c9b717fe-d69d-4c3d-8b05-79342208df17

      image-20220708000544910

      image-20220708000632146

    2. 2번재 전략객체부터는 setNext()의 받기 + this반환외부 연속 체이닝 받기 to 컬렉션 을 적용할 것이다.

      • my) 받기기능을 체이닝으로 하려면 setter느낌이지만, 받고나서 return this로 인해 상태변화된 나 자신을 반환해준다.

      6bb137c0-08ff-4bb9-bc02-ff707ae88528

      image-20220708001024865

    3. 받아서 변화된 나를 반환해주는 setNext()를 정의하면 외부에서 체이닝해서 계속 받을 수 있다.

      ffb08a1c-98b8-4703-8120-fda4deff1958

      image-20220708001228391

적용객체에 주입되어, 적용대상 객체context를 [여러 전략이 적용되어 누적되서 반환될 것의 초기값]을 전달받은 뒤, 내부에 소유한 여러 전략객체를 forloop로 돌면서 여러번 전략메서드를 누적 호출한 뒤 변화된 객체를 최종 반환한다.
  • 전략이 주입되는 적용대상 객체 Plan이 직접 계산해서 외부에 전략으로 계산된 요금을 제공한다.
  • 전략 객체가 누적연산한다면, 그 초기값을 건네주어 -> 누적된 값을 반환받는 것이 context공유의 한 부분이다.
  1. 전략적용 객체 Plan은, 전략주입 구상클래스를 주입받은 것을 활용해서 내부에서 처리를 해주는데, plan 내부에 있는 적용대상 객체(여기선 객체에 적용하진 x) or 누적연산이라면 초기값(Money.ZERO) + 계산시 필요한 정보(calls)을를 전략주입 구상클래스에게 적용하라고 건네준다.

    • 요금계산 적용객체는계산정보 calls누적 연산 초기값을 건네준다.
      • 초기값을 건네주고, 누적연산을 받는 것이야말로 객체context 공유다
        • 값을 건네주고 업데이트된 상태값을 받는다.
        • 값을 건네주고 쌩뚱맞은 값을 반환받거나 반환안받으면 객체context공유가 아님.

    9ce39675-7c9b-494c-9720-e0faa8ee6abf

    image-20220708004651632

  2. 필요한 부수재료들을 만들어준다.

    • List컬렉션은 index에 값을 사용하므로 값context다
    • HashSet은 순서가 보장되며 + 중복검증해주며 + 객체로 꺼내고 넣는 객체context라서 적극 활용한다.

    62838eac-7c76-44df-be6b-89fd22637531

  3. 전략주입 구상클래스에서 여러 전략객체들을 forloop돌면서 누적 적용한다.

    • 개별 전략메서드마다 계산한 값을 파라미터로 온 초기값을 for문위 누적변수(지역변수) 삼아서 누적해주고, 반환해준다.
      • 넘어가는 초기값의 type은 Money의 VO로서 값객체다.

    8f8b25db-9e05-4d0d-9315-02c75f156daa

    image-20220708004603264