스프링/스프링 핵심 원리 - 고급편

22. 전략 패턴 익명 및 람다

sdafdq 2024. 1. 17. 08:26
@Test
void strategyV2(){
    Strategy logic1 = new Strategy() {
        @Override
        public void call() {
            log.info("비즈니스 로직1 실행");
        }
    };
    ContextV1 context1 = new ContextV1(logic1);

    context1.execute();
}

이렇게 익명 클래스로 만들 수 있다.

 

@Test
void strategyV3(){
    ContextV1 context1 = new ContextV1(new Strategy() {
        @Override
        public void call() {
            log.info("비즈니스 로직1 실행");
        }
    });

    context1.execute();
}

아예 이렇게 인자로 넣을 수 도 있고,

 

public interface Strategy {
    void call();
}

만약 이렇게 인터페이스의 메소드가 단 하나라면,

 

@Test
void strategyV4(){
    ContextV1 context1 = new ContextV1(() -> {
        log.info("비즈니스 로직1 실행");
    });

    context1.execute();
}

그냥 람다로 바로 넣을 수 있다.

 

@Test
void strategyV4(){
    ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
    context1.execute();
}

이렇게도 되는데, 실행 명령이 한 줄만 있으면 중괄호를 안 써도 된다.

 

@Test
void strategyV4(){
    ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
    context1.execute();

    ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행"));
    context2.execute();
}

여러 개 일 경우.

 

문맥은 고정된 건데, 그냥 Strategy를 setter 같은 걸로 바꾸면 되지 않나? 

문맥은 싱글톤으로 놔두고?

 

문맥이 싱글톤 일 경우, 동시성 이슈가 있을 수 있음.

 

나중에 배우겠지만 콜백으로 주면 됨.

'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글

24. 템플릿 콜백 패턴  (0) 2024.01.17
23. 전략 패턴 인자로 받기  (0) 2024.01.17
21. 전략 패턴  (0) 2024.01.17
20. 템플릿 메서드 패턴 적용  (0) 2024.01.15
19. 익명 클래스  (0) 2024.01.15