Justin의 개발 로그

[AS-IS] 람다를 사용하지 않은 전통적(?)인 템플릿메서드 패턴 구조

  • 추상클래스를 통해 공통 로직과 템플릿으로 분리할 추상 메서드를 나눈다.
  • 상속받은 클래스에서 추상 메서드를 구현한다.
public class OriginalTemplateMethodPattern {
    abstract class OnlineBanking {
        public void deposit(int amount) {
            // 입금 공통 로직은 여기에 있다.
            System.out.println("입금액: " + amount + "원");
            bearInterest(amount);
        }

        // 인터넷 뱅킹 업체마다 선이자 계산 방식이 다른 경우 템플릿 메소드로 분리
        abstract void bearInterest(int amount);
    }

    private class CocoaTalkOnlineBanking extends OnlineBanking {
        double interestRate = 0.01;

        @Override
        void bearInterest(int amount) {
            System.out.println("코코아톡뱅킹이자: " + Math.round(amount * interestRate) + "원");
        }
    }

    @Test
    void 코코아톡입금테스트() {
        CocoaTalkOnlineBanking banking = new CocoaTalkOnlineBanking();

        banking.deposit(999);
    }
}

 

[TO-BE]람다로 간소화된 템플릿메서드 패턴

  • 추상 클래스-추상 메서드의 역할을 람다 메서드 참조로 변경한다.
  • 아래 예제의 경우 입력 데이터를 활용하는 Comsumer<T>(함수형인터페이스)와 형식이 동일해서 이를 활용
  • bearInterest4CocoaTalk은 코코아톡인터넷뱅킹의 이자 계산 메소드를 제공한다.
public class TemplateMethod {
    public void deposit(int amount, Consumer<Integer> bearInterest) {
        System.out.println("입금액: " + amount + "원");
        bearInterest.accept(amount);
    }

    Consumer<Integer> bearInterest4CocoaTalk = (Integer amount) -> {
        double interestRate = 0.01;
        System.out.println("코코아톡뱅킹이자: " + Math.round(amount * interestRate) + "원");
    };

    @Test
    void 템플릿메소드_람다메서드참조사용() {
        deposit( 999, bearInterest4CocoaTalk);
    }
}

[TO-BE]람다식을 사용하면 조금 더 간소화 가능

  • 재활용이 불필요한 경우 람다식으로 조금 더 코드를 간결하게 만들 수 있다.
import java.util.function.Consumer;

public class TemplateMethod {
    public void deposit(int amount, Consumer<Integer> bearInterest) {
        System.out.println("입금액: " + amount + "원");
        bearInterest.accept(amount);
    }

    @Test
    void 템플릿메서드_람다표현식() {
        deposit( 999, (amount) -> {
                double interestRate = 0.01;
                System.out.println("코코아톡뱅킹이자: " + Math.round(amount * interestRate) + "원");
            });
    }
}
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!