728x90
안녕하세요!
오늘은 템플릿 메소드 패턴을 한 번 만들어보려고 합니다.
템플릿 메소드 패턴은,
전체적인 구조(템플릿)를 상위클래스에서 정의하고 일부 영역을 변경할 수 있게끔 만들어서 중복을 줄이고 코드를 재사용할 수 있게 합니다.
일종의 IoC인 템플릿 메소드 패턴은 많은 프레임워크, 라이브러리에서 사용하고 있습니다.
왜 일종의 IoC냐면,
하위 클래스에서 구현한 추상메소드가 결국 상위 클래스의 흐름에 따라 호출되기 때문입니다.
즉 제어는 상위클래스에서 이루어지는 것입니다.
UML Class Diagram에서 보이는 것처럼 템플릿 메소드 패턴은 상속을 통해 이루어집니다.
코드로 한 번 보겠습니다.
앞으로 나올 코드를 간단하게 설명하자면,
레스토랑에서 손님이 들어왔을 때 인사하는 로봇의 인사(hello) 메소드를 구현할 예정입니다.
1. 어서오세요.
2. OO 레스토랑입니다.
3. 만나서 반갑습니다.
로봇은 여러 레스토랑에서 활용할 수 있기 때문에 레스토랑의 이름을 업체별로 만들어 주려고 합니다.
먼저 템플릿인 추상클래스입니다.
public abstract class RestaurantRobot {
// 하위 클래스가 상위 클래스의 메소드를 오버라이딩 할 수 있고,
// 이는 리스코프 치환 원칙을 어길 여지가 있기 때문에 final 키워드를 붙여줬습니다.
public final void hello() {
step1();
step2(getName());
step3();
}
// 하위클래스에서 자기가 신경써야 할 것만 책임질 수 있게 getName()을 abstract method로 설계했습니다.
protected abstract String getName();
private void step1() {
System.out.println("어서오세요.");
}
private void step2(final String name) {
System.out.println(name + " 레스토랑입니다.");
}
private void step3() {
System.out.println("만나서 반갑습니다.");
}
}
그리고 이 추상 메소드를 구현한 ChpinRestaurant와 TechRestaurant 입니다.
public class ChupinRestaurantRobot extends RestaurantRobot {
@Override
protected String getName() {
return "츄핀";
}
}
public class TechRestaurantRobot extends RestaurantRobot {
@Override
protected String getName() {
return "테크";
}
}
이렇게 추상 메소드를 구현하면,
public class Client {
public static void main(String[] args) {
final RestaurantRobot chupinRes = new ChupinRestaurantRobot();
final RestaurantRobot techRes = new TechRestaurantRobot();
chupinRes.hello();
techRes.hello();
}
}
// 결과
어서오세요.
츄핀 레스토랑입니다.
만나서 반갑습니다.
어서오세요.
테크 레스토랑입니다.
만나서 반갑습니다.
이렇게 원하는 결과를 얻을 수 있습니다.
728x90
'츄Log > 기타 끄적' 카테고리의 다른 글
MVCC (Multi Version Concurrency Control) (0) | 2023.12.21 |
---|---|
템플릿 메소드 콜백 패턴(Template Method Callback Pattern) (0) | 2023.12.14 |
헷갈리는 compare/compareTo 이해하기 (0) | 2023.12.09 |
Java 스트림 (Stream)의 특징 (1) | 2023.12.08 |
숫자 문자열 비교하기 (JAVA String compareTo) (0) | 2023.12.07 |