템플릿 메소드 패턴

존스노우·2024년 5월 29일
0

디자인패턴

목록 보기
6/6

  • 공통 적인 부분은 부모 클래스에 선언을 하고
  • 따로 각 구현 부분이 다른부분은 추상메서드로 선언해서
  • 구현체에서 따로 구현한다.

정의

  • 알고리즘의 각 단계를 정의 서브클래스에서 일부 단계 구현
  • 알고리즘의 골격을 정의 템플릿 메소드 사용시 알고리즘으 ㅣ일부 단계를 서브클래스에서 구현가능, 알고리즘 구조는 그대로 유지하면서
  • 알고리즘의 특정 단계를 서브클래스에서 재정의 가능하다.

장점

  • CaffeineBeveragge 클래스에서 작업 처리 알고리즘 독점
  • 서브클래스에서 코드를 재사용
  • 알고리즘이 한군대 모여있어 한군대만 고치면 됨.
  • 그러나 강력한 의존이 생기지 않나?

후크

  • 추상클래스에 선언되어 있지만 기본 내용 구현 및 아무 코드 들어가있지않음



후크는 언제 활용할까?

  • 알고리즘의 특정 단계가 선택적으로 적용된다면?

  • 필수적이지 않는 부분을 서브클래스에서 구현하도록 만들고 싶을때 후크 사용 뭐야이게..

  • 추상메서드가 너무많아지면? 인터페이스 분리 법칙 사용하면되지

  • 후크 갈고리 뭔가 걸다

  • 뭔갈 걸다? 체크를 한다?

할리우드 원칙

  • 먼저 연락하지마세요 저희가 연락드리겠습니다.
  • 의존성 부패 방지를 위해 활용
  • 결국 의존성 역전 원칙이랑 비슷하다
  • 고수준이든 저수준 구성요소든 인터페이스에 의존하라.
  • 책에 보면 할리우드 원칙은 저수준 구성 요소를 다양하게 사용할 수 있으면서 다른 클래스가 구성 요소에 의존하지 않게 만들어 주는 디자인 구현 기법 제공

템플릿메소드 정렬 (활용)


  • sort() 메소드를 디자인 당시 자바에서는 배열의 서브클래스를 만들지 못하지만

  • 어떤 배열도 정렬 기능 사용할 수 잇도록 만들어야됨.

  • 그래서 정적 메소드 정의하고 대소 부분을 구현체에서 구혀낳게.!

  • 대소 비교하는 부분을 정렬된 객체에서 구현하도록 만들기.


추가 예제

import junit.framework.TestCase;

public class MyTest extends TestCase {
    protected int value1;
    protected int value2;

    // setUp() 메소드는 테스트 전에 실행되는 후크 메소드입니다.
    protected void setUp() {
        value1 = 2;
        value2 = 3;
    }

    // tearDown() 메소드는 테스트 후에 실행되는 후크 메소드입니다.
    protected void tearDown() {
        value1 = 0;
        value2 = 0;
    }

    // 실제 테스트 메소드
    public void testAdd() {
        double result = value1 + value2;
        assertTrue(result == 5.0);
    }
}
public abstract class PaymentProcessor {
    public final void processPayment(PaymentInfo paymentInfo) {
        validatePaymentInfo(paymentInfo);
        processPaymentDetails(paymentInfo);
        sendNotification(paymentInfo);
    }

    protected abstract void processPaymentDetails(PaymentInfo paymentInfo);

    protected void validatePaymentInfo(PaymentInfo paymentInfo) {
        // 결제 정보 유효성 검사 로직
    }

    protected void sendNotification(PaymentInfo paymentInfo) {
        // 결제 완료 후 알림 전송 로직
    }
}

public class CreditCardPaymentProcessor extends PaymentProcessor {
    @Override
    protected void processPaymentDetails(PaymentInfo paymentInfo) {
        // 신용카드 결제 처리 로직
    }
}

public class PayPalPaymentProcessor extends PaymentProcessor {
    @Override
    protected void processPaymentDetails(PaymentInfo paymentInfo) {
        // 페이팔 결제 처리 로직
    }
}
profile
어제의 나보다 한걸음 더

0개의 댓글