design pattern template method

28
디자인 패턴 세미나 템플릿 메소드

Upload: harry-park

Post on 12-Jun-2015

1.443 views

Category:

Technology


7 download

DESCRIPTION

Design Pattern Template Method

TRANSCRIPT

Page 1: Design Pattern Template Method

디자인 패턴 세미나템플릿 메소드

Page 2: Design Pattern Template Method

박형근

[email protected]

http://www.codereview.co.kr

Page 3: Design Pattern Template Method

디자인 패턴 ?

Page 4: Design Pattern Template Method

디자인 패턴 ?

“설계 시 겪게 되는

일반적인 문제상황에 대한

이미 알려진 해결책”

Page 5: Design Pattern Template Method

템플릿 메소드(Template Method)

Page 6: Design Pattern Template Method

템플릿 메소드 (Template Method)

•템플릿 : 양식

Page 7: Design Pattern Template Method

템플릿 메소드 (Template Method)

•템플릿 : 양식

Page 8: Design Pattern Template Method

예제 : 커피와 홍차

Page 9: Design Pattern Template Method

템플릿 메소드

• 크게 보았을 때 같은 처리를 하는 두 메소드가

• 세부적인 처리만 다를 경우

• 큰 틀(템플릿)을 담당하는 메소드를 만들고

• 세부적인 처리는 상속된 클래스에서 구현.

Page 10: Design Pattern Template Method

예제 : 기존에 구현된 커피 코드에홍차를 추가 해 봅시다.

Page 11: Design Pattern Template Method

커피 코드

Void main () {

Coffee aCoffee;

aCoffee.prepareRecipe();}

public class Coffee {

void prepareRecipe() {

boilWater();

brewCoffeeGrinds();

pourInCup();

addSugarAndMilk();

}}

Page 12: Design Pattern Template Method

기존 커피 코드에 홍차를 추가

Void main () {

Coffee aCoffee;

aCoffee.prepareRecipe();}

public class Coffee {

void prepareRecipe() {

boilWater();

brewCoffeeGrinds();

pourInCup();

addSugarAndMilk();

}}

steepTeaBag();

addLemon();

Page 13: Design Pattern Template Method

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.함수 인자에 의한 처리

Page 14: Design Pattern Template Method

SRP

Single Responsibility Principal 단일책임원칙

Page 15: Design Pattern Template Method

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 원칙에 위배

Page 16: Design Pattern Template Method

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();

}}

Page 17: Design Pattern Template Method

DRY(Do Not Repeat Yourself)

Page 18: Design Pattern Template Method

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 원칙에 위배

Page 19: Design Pattern Template Method

템플릿 메소드(Template Method)

Page 20: Design Pattern Template Method

템플릿 메소드

Page 21: Design Pattern 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(); }}

Page 22: Design Pattern 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(); }}

Page 23: Design Pattern Template Method

템플릿 메소드

Page 24: Design Pattern Template Method

템플릿 메소드

• 두 클래스의 부모 클래스를 만든다.

• 좋은 이름이 중요하다 !!

• 부모 클래스에 템플릿 메소드를 만든다.

• 세부적으로 달라져야 할 부분을 가상함수로 정의(함수 signature가 같아야 한다.)

• 자식 클래스에서 세부정의를 구현한다.

• Application에서는 부모 클래스만 사용하도록 변경

Page 25: Design Pattern Template Method

고려할 점

• 실제 코드에서는 훨씬 복잡하다.

• Pure virtual vs Hook

• 세부구현의 함수 인자가 다르면?

• 상속 vs 조합

Page 26: Design Pattern Template Method

템플릿 메소드 : 요약

• 크게 보았을때 같은 처리를 하는 두 메소드

• 세부적인 처리만 다를 경우

• 큰 틀(템플릿)을 담당하는 메소드

• 세부적인 처리는 상속된 클래스에서 정의

Page 27: Design Pattern Template Method

토의

Page 28: Design Pattern Template Method

감사합니다 !