본문 바로가기

IT/디자인 패턴(Design Pattern)

[디자인 패턴] 템플릿메소드 패턴(TemplateMethod Pattern)

1) 개요

상위 클래스에서 처리의 흐름을 제어하며, 하위클래스에서 처리의 내용을 구체화하는 디자인 패턴입니다.

공통되는 사항은 상위 추상 클래스에서 구현하며, 각 객체마다 다른 부분은 하위 클래스에서 구현합니다.

상속을 통한 확장 개발 방법으로 코드의 중복을 줄이고, 리팩토링(Refactoring)에 유리하여 가장 많이 사용되는 패턴 중 하나입니다.


2) UML


- Abstract Class : 추상 클래스로 templateMethod를 정의합니다.

- Concrete Class : 부모 클래스에서 abstract로 정의된 templateMethod를 구현합니다.


3) 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class OrderProcessTemplate {
    public abstract void doSelect();
    public abstract void doPayment();
    public abstract void doDelivery();
    
    public final void giftWrap() {
        try {
            System.out.println("Gift wrap successful");
        } catch (Exception e) {
            System.out.println("Gift wrap unsuccessful");
        }
    }
    
    public final void processOrder(boolean isGift) {
        doSelect();
        doPayment();
        if (isGift) giftWrap();
        doDelivery();
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class StoreOrder extends OrderProcessTemplate{
 
    @Override
    public void doSelect() 
    { 
        System.out.println("Do Select : Customer chooses the item from shelf."); 
    } 
  
    @Override
    public void doPayment() 
    { 
        System.out.println("Do Payment : Pays at counter through cash/POS"); 
    } 
  
    @Override
    public void doDelivery() 
    { 
        System.out.println("Do Delivery : Item deliverd to in delivery counter."); 
    } 
 
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class NetOrder extends OrderProcessTemplate{
 
    @Override
    public void doSelect() {
        System.out.println("Do Select : Item added to online shopping cart"); 
        System.out.println("Do Select : Get gift wrap preference"); 
        System.out.println("Do Select : Get delivery address."); 
    }
 
    @Override
    public void doPayment() {
        System.out.println 
        ("Do Payment : Online Payment through Netbanking, card or Paytm");
    }
 
    @Override
    public void doDelivery() {
           System.out.println 
           ("Do Delivery : Ship the item through post to delivery address"); 
    }
 
}
cs

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main(String[] args) {
        OrderProcessTemplate netOrder = new NetOrder();
        netOrder.processOrder(true);
        System.out.println();
        OrderProcessTemplate storeOrder = new StoreOrder();
        storeOrder.processOrder(true);
    }
}
cs