design pattern template method
DESCRIPTION
Design Pattern Template MethodTRANSCRIPT
디자인 패턴 세미나템플릿 메소드
디자인 패턴 ?
디자인 패턴 ?
“설계 시 겪게 되는
일반적인 문제상황에 대한
이미 알려진 해결책”
템플릿 메소드(Template Method)
템플릿 메소드 (Template Method)
•템플릿 : 양식
템플릿 메소드 (Template Method)
•템플릿 : 양식
예제 : 커피와 홍차
템플릿 메소드
• 크게 보았을 때 같은 처리를 하는 두 메소드가
• 세부적인 처리만 다를 경우
• 큰 틀(템플릿)을 담당하는 메소드를 만들고
• 세부적인 처리는 상속된 클래스에서 구현.
예제 : 기존에 구현된 커피 코드에홍차를 추가 해 봅시다.
커피 코드
Void main () {
Coffee aCoffee;
aCoffee.prepareRecipe();}
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}}
기존 커피 코드에 홍차를 추가
Void main () {
Coffee aCoffee;
aCoffee.prepareRecipe();}
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}}
steepTeaBag();
addLemon();
Void main () {
Coffee aCoffee;
aCoffee.prepareRecipe(isCoffee);}
public class Coffee {
void prepareRecipe(bool isCoffee) {
boilWater();
if (isCoffee) brewCoffeeGrinds();
else steepTeaBag();
pourInCup();
if (isCoffee) addSugarAndMilk();
else addLemon();
}}
Case 1.함수 인자에 의한 처리
SRP
Single Responsibility Principal 단일책임원칙
Void main () {
Coffee aCoffee;
aCoffee.prepareRecipe(isCoffee);}
public class Coffee {
void prepareRecipe(bool isCoffee) {
boilWater();
if (isCoffee) brewCoffeeGrinds();
else steepTeaBag();
pourInCup();
if (isCoffee) addSugarAndMilk();
else addLemon();
}}
Case 1. 함수 인자에 의한 처리
Cocoa 가추가된다면?
SRP 원칙에 위배
Case 2. Copy & Paste
Void main () {
Coffee aCoffee;
aCoffee.prepareRecipe();}
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}}
Void main () {
Tea aTea;
aTea.prepareRecipe();}
public class Tea {
void prepareRecipe() {
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}}
DRY(Do Not Repeat Yourself)
Void main () {
Coffee aCoffee;
aCoffee.prepareRecipe();}
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}}
Void main () {
Coffee aTea;
aTea.prepareRecipe();}
public class Tea {
void prepareRecipe() {
boilWater();
steepTeaBag();
pourInCup();
addLemon();
prepareSpoon();
}}
공통 부분의 추가/수정시 동기화 문제발생
Case 2. Copy & PasteCase 2. Copy & Paste
DRY 원칙에 위배
템플릿 메소드(Template Method)
템플릿 메소드
템플릿 메소드
Void main () {
Beverage *aBev = new Coffee;
aBev->prepareRecipe();}
class Beverage {
Public:
void prepareRecipe() {
boilWater();
brew();
pourInCup();
add();
}
virtual void brew() = 0;
virtual void add() = 0;}
class Coffee : public Beverage {
Protected:
void brew() { brewCoffee(); }
void add() {addSugarAndMilk();}
}
class Tea : public Beverage {
Protected:
void brew() { steepTeaBag();}
void add() { addLemon(); }}
템플릿 메소드
Void main () {
Beverage *aBev = new Coffee;
aBev->prepareRecipe();}
class Beverage {
Public:
void prepareRecipe() {
boilWater();
brew();
pourInCup();
add();
}
virtual void brew() = 0;
virtual void add() = 0;}
class Coffee : public Beverage {
Protected:
void brew() { brewCoffee(); }
void add() {addSugarAndMilk();}
}
class Tea : public Beverage {
Protected:
void brew() { steepTeaBag();}
void add() { addLemon(); }}
템플릿 메소드
템플릿 메소드
• 두 클래스의 부모 클래스를 만든다.
• 좋은 이름이 중요하다 !!
• 부모 클래스에 템플릿 메소드를 만든다.
• 세부적으로 달라져야 할 부분을 가상함수로 정의(함수 signature가 같아야 한다.)
• 자식 클래스에서 세부정의를 구현한다.
• Application에서는 부모 클래스만 사용하도록 변경
고려할 점
• 실제 코드에서는 훨씬 복잡하다.
• Pure virtual vs Hook
• 세부구현의 함수 인자가 다르면?
• 상속 vs 조합
템플릿 메소드 : 요약
• 크게 보았을때 같은 처리를 하는 두 메소드
• 세부적인 처리만 다를 경우
• 큰 틀(템플릿)을 담당하는 메소드
• 세부적인 처리는 상속된 클래스에서 정의
토의
감사합니다 !