[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) + "원");
});
}
}
'프로그래밍 > OOP_Pattern_TDD' 카테고리의 다른 글
람다 - 의무체인 패턴 (0) | 2023.03.03 |
---|---|
람다 - 옵저버 패턴 (0) | 2023.03.03 |
람다로 효과적 프로그래밍 - 전략패턴 (0) | 2023.02.28 |
람다로 효과적 프로그래밍 - 람다를 활용해서 Enum에 메서드 재사용 (0) | 2023.02.28 |
람다로 효과적 프로그래밍 - 조건부 연기 실행, 실행 어라운드 패턴 (0) | 2023.02.28 |