SSAFY11th-book-study / book-study

SSAFY 11기 6반의 '토비의 스프링 스터디'
0 stars 0 forks source link

[3.5] 템플릿 메서드 패턴 vs 전략 패턴 vs 템플릿 콜백 패턴 #32

Closed gmelon closed 7 months ago

gmelon commented 7 months ago

3장에서 계속해서 언급되는 아래 3가지 디자인 패턴들이 닮아있으면서도 조금씩 다른 점이 있는 것 같습니다.

명확하게 정리하고 넘어가면 좋을 것 같아서 이슈 남깁니다. 저도 찾아보고 댓글 달아두겠습니다!

sootudio commented 7 months ago

유명한 사이트라서 다들 이미 보셨을 수도 있지만... 여기만큼 설명이 맛도리인 곳이 없어서 참고 사이트로 남깁니다.

템플릿 메서드 패턴 - https://refactoring.guru/ko/design-patterns/template-method

전략 패턴 - https://refactoring.guru/ko/design-patterns/strategy

템플릿 콜백 패턴은 GOF 패턴이 아니라서 그런지, 위 사이트에 설명이 없어 괜찮은 설명이 있는 블로그를 찾아왔습니다.

템플릿 콜백 패턴 - https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-Template-Callback-%EB%B3%80%ED%98%95-%ED%8C%A8%ED%84%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

위에 있는 사이트들에 아주 정리가 잘 되어 있지만... 저도 나름대로 정리를 해 보자면

템플릿 메소드 패턴
- 개념 - 부모 클래스에서 알고리즘의 골격을 정의하고, 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드​ 하는 디자인 패턴 - 변하지 않는 기능(템플릿)은 부모 클래스에 만들어두고 자주 변경되며 확장할 기능은 자식 클래스에서 만든다. - 사용 이유 - 중복 코드를 부모 클래스로 가져올 수 있음. - 자식 클래스의 역할을 줄이고, 핵심 로직을 부모 클래스에서 관리하므로서 관리가 용이해짐. - 알고리즘의 구조를 변경하지 않고도 일부 단계를 재정의할 수 있음. - 예시 코드 ```java // 부모 클래스 abstract class AbstractClass { // 템플릿 메서드 public final void templateMethod() { primitiveOperation1(); primitiveOperation2(); } // 추상 메서드 protected abstract void primitiveOperation1(); protected abstract void primitiveOperation2(); } // 자식 클래스 class ConcreteClass extends AbstractClass { @Override protected void primitiveOperation1() { System.out.println("ConcreteClass: primitiveOperation1 구현"); } @Override protected void primitiveOperation2() { System.out.println("ConcreteClass: primitiveOperation2 구현"); } } // 클라이언트 코드 public class Main { public static void main(String[] args) { AbstractClass abstractClass = new ConcreteClass(); abstractClass.templateMethod(); } } ``` 코드는 gpt가 만들어 줬습니다... ~~???: 자네는 gpt보다 잘하는게 뭔가?~~ 해당 코드를 보면, 자식 클래스가 하나만 만들어져 있어서 템플릿 메서드 패턴의 장점이 크게 부각되지 않을 수도 있지만, 부모 클래스의 추상 메서드들을 정의하는 자식 클래스들이 더 많아질 때 코드의 중복이 줄어든다는 장점이 있을 수 있습니다.
전략 패턴
- 개념 - 알고리즘을 각각의 클래스로 정의하고, 실행 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 할 수 있게 하는 패턴 - 사용이유 - 콘텍스트를 변경하지 않고도 새로운 전략들을 추가할 수 있음. - 예시코드 ```java // 전략 인터페이스 interface Strategy { void execute(); } // 전략 구현 클래스 class ConcreteStrategy1 implements Strategy { @Override public void execute() { System.out.println("ConcreteStrategy1 실행"); } } class ConcreteStrategy2 implements Strategy { @Override public void execute() { System.out.println("ConcreteStrategy2 실행"); } } // 컨텍스트 클래스 class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void executeStrategy() { strategy.execute(); } } // 클라이언트 코드 public class Main { public static void main(String[] args) { Context context = new Context(new ConcreteStrategy1()); context.executeStrategy(); context = new Context(new ConcreteStrategy2()); context.executeStrategy(); } } ``` 위 코드에서 ConcreteStrategy1, ConcreteStrategy2는 전략을 구체화한 객체들이고, 클라이언트에서 ConcreteStrategy1과 2로 실행 시간에 전략들을 선택하여 실행하고 있습니다.
템플릿 콜백 패턴
- 개념 - 전략 패턴의 기본 구조에 익명 내부 클래스를 활용한 방식 - 템플릿은 작업 흐름을 가진 코드를 재사용한다는 의미에서 붙인 이름이며, 콜백은 템플릿 안에서 호출되는 것을 목적으로 만들어진 오브젝트 - 사용이유 - 알고리즘의 일부를 자식 클래스에 위임하여, 알고리즘의 일부를 변경하고 싶을 때 자식 클래스에 콜백을 전달하기 위해 - 예시코드 ```java // 템플릿 클래스 class TemplateClass { public void templateMethod(Callback callback) { System.out.println("템플릿 메서드 실행"); callback.callbackMethod(); } } // 콜백 인터페이스 interface Callback { void callbackMethod(); } // 클라이언트 코드 public class Main { public static void main(String[] args) { TemplateClass template = new TemplateClass(); template.templateMethod(new Callback() { @Override public void callbackMethod() { System.out.println("콜백 메서드 실행"); } }); } } ``` 언제 다쓰냐...
gmelon commented 7 months ago

템플릿 메서드 패턴

한줄요약

부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드​(재정의)​할 수 있도록 하는 행동 디자인 패턴

장단점

전략 패턴

한줄 요약

여러 알고리즘을 캡슐화하고 이들을 상호 교체가 가능하게 만들어서 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있게 하는 디자인 패턴

장단점

템플릿 콜백 패턴과의 차이점

템플릿 콜백 패턴은 알고리즘의 일부를 클라이언트가 제공하는 콜백 함수에 위임하는 반면, 전략 패턴은 전략 객체를 사용하여 알고리즘을 교체. 따라서 전략 패턴은 전략을 객체로 캡슐화하는 반면, 템플릿 콜백 패턴은 콜백 함수를 사용하여 알고리즘의 일부를 외부에서 제공함

템플릿 콜백 패턴

한줄 요약

알고리즘의 일부를 클라이언트가 제공하는 콜백 함수에 위임하여 알고리즘의 동작을 변경할 수 있도록 하는 디자인 패턴

장단점