템플릿 콜백 패턴 (template callback pattern)

JunSeong_Park·2023년 1월 3일
0
post-custom-banner

견본/회신 패턴은 전략 패턴의 변형으로 스프링의 3대 프로그래밍 모델 중 하나인 DI ( 의존성 주입 )에서 사용하는 전략 패턴

전략을 익명 내부 클래스로 정의해서 사용한다는 특징을 가지고 있다

기존의 전략 패턴

전략 인터페이스

package DesignPattern.templateCallbackPattern;

public interface Strategy {
    public abstract void runStrategy();
}

전략을 사용하는 컨텍스트

package DesignPattern.templateCallbackPattern;

public class Soldier {
    void runContext(Strategy strategy) {
        System.out.println("시작");
        strategy.runStrategy();
        System.out.println("종료");
    }
}

익명 내부 전략을 사용하는 클라이언트

package DesignPattern.templateCallbackPattern;

public class Client {
    public static void main(String[] args) {
        Soldier rambo = new Soldier();

        rambo.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("GUN");
            }
        });
        System.out.println();

        rambo.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("SWORD");
            }
        });
        System.out.println();

        rambo.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("BOW");
            }
        });
    }

}

내부 전략을 계속 수정하는 중복 과정을 거치는데 이를 템플릿 콜백 패턴으로 바꿔보자

템플릿 콜백 패턴 활용

전략 인터페이스

package DesignPattern.templateCallbackPattern;

public interface Strategy {
    public abstract void runStrategy();
}

전략을 사용하는 컨텍스트 (전략을 생성하는 코드를 컨텍스트 클래스 내에 생성)

package DesignPattern.templateCallbackPattern;

public class Soldier {
    void runContext(Strategy strategy) {
        System.out.println("시작");
        strategy.runStrategy();
        System.out.println("종료");
    }

    private Strategy executeWeapon(final String weaponName) {
        return new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println(weaponName);
            }
        };
    }
}

익명 내부 전략을 사용하는 클라이언트

package DesignPattern.templateCallbackPattern;

public class Client {
    public static void main(String[] args) {
        Soldier rambo = new Soldier();

        rambo.runContext("GUN");
        System.out.println();

        rambo.runContext("SWORD");
        System.out.println();

        rambo.runContext("BOW");
    }

}

중복과정의 코드들이 훨씬 간편해진 것이 보이는가? 전략패턴과 구조자체는 동일하지만 중복과정을 줄이고자 전략 생성 코드를 컨텍스트안에 집어넣은 부분을 이해하는 것이 핵심이다

전략을 익명 내부 클래스로 구현한 전략 패턴

마찬가지로 전략 패턴과 똑같이 OCP 와 DIP 가 적용된 설계 패턴이다

출처 : 스프링 입문을 위한 자바

profile
안녕하세요 언어에 구애 받지 않는 개발자가 되고 싶은 박준성입니다
post-custom-banner

0개의 댓글