📜 제목으로 보기

전략패턴처럼 분기를 추상화하되, 외부주입 대신 enum에서 구현체 받아오기

01 일단 1개 분기에 대해서 전략package>구현체1개 -> 내부 구현체클래스.전메()로 1개만 먼저 만들기

  1. 각 분기별 전체 로직이 추상체변수. 전메()로 실행될 수 있도록
    1. 1개 분기를 예시로 구현체class생성 -> 전메로 로직 일괄호출()하도록 메서드를 만든다.

image-20220415101112507

public void run() {
    final PairProgram pairProgram = new PairProgram();

    while (!pairProgram.isOff()) {
        final Menu menu = Menu.from(inputView.inputMenu());
        if (menu == Menu.MENU_1) {
            pairMatch(pairProgram);
        }
        if (menu == Menu.MENU_2) {
            pairSelect(pairProgram);
        }
        if (menu == Menu.MENU_3) {
            pairProgram.initPairs(); 
        }
        if (menu == Menu.MENU_Q) {
            pairExit(pairProgram);
        }
    }
}

image-20220415101948240

image-20220415101527525

image-20220415101959771

image-20220415101637829

image-20220415101721165

image-20220415101732381

image-20220415101804492

02 1개 구현체속 전메가 완성 -> @override를 붙여서 인터페이스로 뺀다.

image-20220415101848572

image-20220415101912068

image-20220415102021291

03 뽑아낸 전략추상체.전메()로 로직상의 구현체.전메()를 대신해야한다. 구현체들의 외부주입의 전략패턴이 아니라면? -> enum의 필드에 함형로 구현체들을 매핑해놓고 가져다 사용해야한다. enum필드 = 함형 Type이다.추상체>추상체>

image-20220415102317954

원래는 구현체 1개 -> 추상체로 바꾸고 -> 그 추상체를 변수or파라미터에서 받아서 외부제공해줘야하는데, 여기서는 enum에게 메세지를 던져서 해당 구현체가 나오도록 던져져야한다.

image-20220415114917489

  1. 분기마다 구현체실행되니 -> 선택된 enum의 field에 분기별 구현체 생성 매핑해둔다.
    • 이 때, enum의 구현체 매핑 필드 변수구현체 생성호출하는 함수형인터페이스<추상체>가 된다.
  2. enum에게 메세지를 던져 현재 선택된 구현체에 구현체.전메()를 쓸 수 있도록 추상체.전메()로 정의해준다.
  • enum에게 메세지를 던질 시,

  • enum으로 가서, 각 필드마다, 분기에서 추상체.전메()형태로 사용될 new 구현체()들을 생성할 수있게 함수형인터페이스로 정의해주고, 필드의 변수명을 함형<추상체>로 받아준다.

1) 추상체 객체 통로를 통한 구현체 외부주입(전략패턴)이 아니라, 2) 추상체 객체 통로없이 enum의 추상체 필드에 매핑된 구현체 가져오는 방법을 쓴다. (외부주입될 구현체들은 enum에 메달려 있고(매핑), 그것을 enum특성으로 돌면서 찾아거 가져온다.)

image-20220415112107056

변수자리에 함수호출(생성자호출하여 객체생성)을 매핑하고 싶다면, () -> {} 람다로 정의해두고 필드는 함수형인터페이스로 정의해주면 된다.

image-20220415112522045

image-20220415112748771

image-20220415112907659

이넘에 넣어줄 생성자호출함수 정의하면서 나머지 분기도 다 정리해준다.

image-20220415113324976

  • 그냥 기존 구현체 1개를 드래그해서 복붙해서 생성하는게 더 빠를지도?

    image-20220415113405720

image-20220415113622687 image-20220415113631591

그냥 첨부터 enum. 메달린구현체getter()로 해주면 된다. 이제 알아서 구현체를 가져온 상태 -> 전메만 호출시켠 알아서 각 분기속 로직이 작동된다.

image-20220415113755358

image-20220415113812886

image-20220415113913247

public void run() {
    final PairProgram pairProgram = new PairProgram();

    while (!pairProgram.isOff()) {
        final Menu menu = Menu.from(inputView.inputMenu());
        new PairMatch().execute(inputView, outputView, pairProgram);

        final Supplier<CommandMenu> commandMenuGenerator = menu.getCommandMenuGenerator();
        final CommandMenu commandMenu = commandMenuGenerator.get();
        commandMenu.execute(inputView, outputView, pairProgram);
    }
}
input -> output -> input 꼬리를 무는 controller 속 순서로직 -> 메세지보내서 내부에서 처리
  • 최초 시작 객체에 메세지를 던지면 된다. 메세지를 던질 때는, 첨부터 필요한 재료를 다 던져서, 책임을 위임한다.

    • 첫시작객체.메세지를 가장 마지막 메서드()

    image-20220415115432656

image-20220415115528957

  • 메서드추출로 해주는게 편하다 -> 메세지를 보낼 시작객체만 앞으로 빼면 된다.

    image-20220415115641110

image-20220415115912634image-20220415115953201

  • 빨간줄뜨는 메소드내 없는 객체 -> 파라미터로 추출

    • 자기자신이 메세지보내고 있는 객체. -> 생략
    • 자기자신이 파라미터로 들어간다? -> this

    image-20220415120050745 image-20220415120059372

image-20220415120200987