๋ฐ์ํ
Templete Method Pattern
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด(Template Method Pattern)์ ์์ ํด๋์ค์์ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ , ํ์ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ํน์ ๋จ๊ณ๋ฅผ ๊ตฌํํ๋ ๋์์ธ ํจํด์ ๋๋ค.
- ์ด ํจํด์ ํตํด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๊ณ ๋ฆฌ์ฆ์ ํน์ ๋จ๊ณ๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
- ํ ํ๋ฆฟ์ด๋, ์ฌ์ ์ ์๋ฏธ๋ก๋ ํํ์ด๋ผ๊ณ ํฉ๋๋ค.
- ๋ฌธ์, ๋ํ์ผ๋ก ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ์์ ํ๋ผ์คํฑ ํ์ ์๊ฐํด๋ณผ ์ ์์ต๋๋ค.
- ์ค์ ๋ก ์ด๋ค ๋ํ์ด ๊ทธ๋ ค์ง์ง๋ ํ๊ธฐ๊ตฌ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
- ํ์ผ๋ก ๊ทธ๋ฆฌ๋ฉด ํ์ผ๋ก ๊ทธ๋ฆฐ ๋ํ์ด ๋๊ณ , ์ฐํ๋ก ๊ทธ๋ฆฌ๋ฉด ์ฐํ๋ก ๊ทธ๋ฆฐ ๋ํ์ด ๋ฉ๋๋ค.
- Template Method ํจํด์ ํ ํ๋ฆฟ ๊ธฐ๋ฅ์ ๊ฐ์ง ํจํด์ ๋๋ค.
- ์์ ํด๋์ค ์ชฝ์ ํ ํ๋ฆฟ ๋ฉ์๋๊ฐ ์ ์๋์ด ์๊ณ , ๊ทธ ๋ฉ์๋ ์ ์ ์์๋ ์ถ์ ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
- ๋ฐ๋ผ์ ์์ ํด๋์ค์ ํ๋ก๊ทธ๋จ๋ง ๋ณด๋ฉด ์ถ์ ๋ฉ์๋๋ค์ ์ด๋ป๊ฒ ํธ์ถํ๊ณ ์๋์ง ์ ์ ์์ต๋๋ค.
- ์ถ์ ๋ฉ์๋๋ฅผ ์ค์ ๋ก ๊ตฌํํ๋ ๊ฒ์ ํ์ ํด๋์ค์ด๋ฉฐ, ํ์ ํด๋์ค ์์์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
- ์๋ก ๋ค๋ฅธ ํ์ ํด๋์ค๊ฐ ์๋ก ๋ค๋ฅธ ๊ตฌํ์ ์คํํ๋ฉด ์๋ก ๋ค๋ฅธ ์ฒ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
- ๊ทธ๋ฌ๋, ํ์ ํด๋์ค๋ค์์ ์ด๋ค ๊ตฌํ์ ํ๋๋ผ๋ ์ฒ๋ฆฌ์ ํฐ ํ๋ฆ์ ์์ ํด๋์ค์์ ๊ฒฐ์ ํ ๋๋ก ์ด๋ฃจ์ด์ง๋๋ค.
- ์์ ํด๋์ค์์ ๋ผ๋๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ํ์ ํด๋์ค์์๋ ๊ทธ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ๊ฒฐ์ ํ๋ ํจํด์ ๋๋ค.
Class์ Method๋ค์ด Templete์ผ๋ก ์ ๊ณต๋๋ Pattern
- Base class์๋ Template method๊ฐ ์กด์ฌํฉ๋๋ค.
- Client๋ Template method๋ง ํธ์ถํฉ๋๋ค.
- Template method ๋ด๋ถ์์ ์ฌ๋ฌ step ํจ์ ํธ์ถ๋ฉ๋๋ค.
- Step ํจ์๋ค์ Base class์์ ์ ๊ณต๋๋ abstract method์ ๋๋ค.
- Base class์์ ์์๋ฐ์ Child class๋ abstract method์ธ step ํจ์๋ค์ overrideํ ์ ์๋ ๊ถํ์ด ์๊น๋๋ค.
Child class๋ step2()๋ฅผ override ํ์ผ๋ฏ๋ก Child object์ Template Method๋?
Base class์ step1() -> Child class์ step2() -> Base class์ step3() ์์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
Example - ๋ผ๋ฉด ๋์ด๋ ๋ ์ํผ
- BasicRecipe class๋ Template method๋ก CookRamen์ ๊ฐ์ง๋๋ค.
- CookRamen์ ๋ด๋ถ์ ์ผ๋ก boilWater, addRamen, wait ํจ์๋ฅผ ๊ฐ์ง๋๋ค.
- ์ทจํฅ์ ๋ฐ๋ผ ๋ผ๋ฉด ๋ ์ํผ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- BasicRecipe๋ฅผ ์์๋ฐ์์ Recipe1, Recipe2๋ฅผ ์์ฑํฉ๋๋ค.
- Recipe1์ ๋ฌผ์ ๋ง์ด ๋ฃ๊ณ ๋์ด๋ ๋ ์ํผ
- boilWater()๋ฅผ override
- Recipe2๋ ๋ผ๋ฉด์ ์ค๋ ๋์ด๋ ๋ ์ํผ
- wait()์ override
- Recipe1์ ๋ฌผ์ ๋ง์ด ๋ฃ๊ณ ๋์ด๋ ๋ ์ํผ
๊ธฐ๋ณธ ํด๋์ค ๊ตฌ์กฐ
class BasicRamenRecipe:
def cookRamen(self):
self.boilWater()
self.addRamen()
self.addons()
self.wait()
def boilWater(self):
print("boil 550ml of water")
def addRamen(self):
print("add noodles, soup base, flakes")
def addons(self):
pass
def wait(self):
print("cook for 4min 30s")
- BasicRamenRecipe ํด๋์ค: Template method์ธ cookRamen์ ๊ฐ์ง๋๋ค.
- Template Method: cookRamen
- ๋ด๋ถ์ ์ผ๋ก boilWater, addRamen, addons, wait ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
- boilWater(): ๋ฌผ 550ml ๋์.
- addRamen(): ๋ฉด, ์คํ, ํ๋ ์ดํฌ๋ฅผ ๋ฃ์ด์ค.
- addons(): ๊ธฐ๋ณธ ์ฌ๋ฃ ์ด์ธ์ ์ฌ๋ฃ๋ฅผ ๋ฃ๋ ๊ฒ์ธ๋ฐ ๊ธฐ๋ณธ ๋ผ๋ฉด์ด๋ฏ๋ก pass.
- wait(): 4๋ถ 30์ด ๋์ ๋์ฌ์ค.
basicRecipe = BasicRamenRecipe()
basicRecipe.cookRamen()
# ์ถ๋ ฅ:
# boil 550ml of water
# add noodles, soup base, flakes
# cook for 4min 30s
- BasicRamenRecipe์ object์ธ basicRecipe์ด ์์ฑ๋ฉ๋๋ค.
- Public method์ธ cookRamen() ํธ์ถํ๋ฉด ๋ด๋ถ์ step ํจ์์ธ boilWater, addRamen, wait ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ํ๋ฅผ ์ถ๊ฐํ๋ ๋ผ๋ฉด ๋ ์ํผ
class NocopeRecipe(BasicRamenRecipe):
def addons(self):
print("add onions")
- NocopeRecipe: BasicRamenRecipe๋ฅผ ์์ ๋ฐ์ต๋๋ค.
- ๊ธฐ๋ณธ ๋ ์ํผ์์ ์ํ๋ง ์ถ๊ฐํ๋ฏ๋ก addons()๋ง ์ฌ์ ์ํฉ๋๋ค.
nocopeRecipe = NocopeRecipe()
nocopeRecipe.cookRamen()
# ์ถ๋ ฅ:
# boil 550ml of water
# add noodles, soup base, flakes
# add onions
# cook for 4min 30s
- NocopeRecipe object์ธ nocopeRecipe๋ฅผ ์์ฑํฉ๋๋ค.
- ์ํ ์ถ๊ฐํ๋ ๋ถ๋ถ ์ ์ธํ๊ณ BasicRamenRecipe์ ๋์ผํฉ๋๋ค.
๋ฌผ์ ๋ง์ด ๋ฃ๊ณ ์ค๋ ๋์ด๋ ๋ผ๋ฉด ๋ ์ํผ
class GrandmaRecipe(BasicRamenRecipe):
def boilWater(self):
print("boil 1000ml of water")
def wait(self):
print("cook for 10m")
- GrandmaRecipe: BasicRamenRecipe๋ฅผ ์์ ๋ฐ์ต๋๋ค
- ๊ธฐ๋ณธ ๋ ์ํผ์์ ๋ฌผ์ ๋ง์ด ๋ฃ๊ธฐ ์ํด boilWater ํจ์๋ฅผ ์ฌ์ ์ ํฉ๋๋ค.
- 10๋ถ ๋์ ๋์ด๊ธฐ ์ํด wait ํจ์๋ฅผ ์ฌ์ ์ ํฉ๋๋ค.
grammaRecipe = GrandmaRecipe()
grammaRecipe.cookRamen()
# ์ถ๋ ฅ:
# boil 1000ml of water
# add noodles, soup base, flakes
# cook for 10m
- GrandmaRecipe object์ธ grammaRecipe๋ฅผ ์์ฑํฉ๋๋ค.
- boilWater()๊ณผ wait() ํจ์ ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋์์ผ๋ฉฐ ๋๋จธ์ง๋ BasicRamenRecipe์ ๋์ผํฉ๋๋ค.
Template Method ํจํด์ Base class์์ ์ ๊ณต๋๋ Abstract methods๋ฅผ ์ฌ์ ์ํ๋ ํจํด์ ๋๋ค.
๊ฐ๋ ํ์ฅ
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ฅ์
- ๋ก์ง์ ๊ณตํตํํ ์ ์์ต๋๋ค.
- ์์ ํด๋์ค์ ํ ํ๋ฆฟ ๋ฉ์๋์์ ์๊ณ ๋ฆฌ์ฆ์ด ๊ธฐ์ ๋์ด ์์ผ๋ฏ๋ก, ํ์ ํด๋์ค์์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ผ์ผ์ด ๊ธฐ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์์ ํด๋์ค์ ํ์ ํด๋์ค์ ์ฐ๊ณ
- ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์์๋ ์์ ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ๊ธด๋ฐํ๊ฒ ์ฐ๊ณ๋์ด ์๋ํ๊ณ ์์ต๋๋ค.
- ๋ฐ๋ผ์ ์์ ํด๋์ค์์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ค์ ๋ก ํ์ ํด๋์ค์์ ๊ตฌํํ ๋์๋ ๊ทธ ๋ฉ์๋๊ฐ ์ด๋ ํ์ด๋ฐ์ ํธ์ถ๋๋์ง ์ดํดํด์ผ ํฉ๋๋ค.
- ์์ ํด๋์ค์ ์์ค ํ๋ก๊ทธ๋จ์ ๊ธฐ์ ์ ๊ฑฐ์ ํ์ง ์์ผ๋ฉด ํ์ ํด๋์ค์ ๊ตฌํ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ฐ๋๋ก, ์์ ํด๋์ค์์ ๊ธฐ์ ์ ๋ง์ด ํ๊ฒ ๋๋ฉด ํ์ ํด๋์ค์์ ์์ ๋๊ฐ ์ค์ด๋ญ๋๋ค.
- ์ฒ๋ฆฌ์ ๊ณจ๊ฒฉ์ ์์ ํด๋์ค์์ ํ๊ณ , ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ํ์ ํด๋์ค์์ ์ํํ๋๋ฐ, ์ด๋ค ๋ ๋ฒจ์์ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฐฐํ ์ง, ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ์์ ํด๋์ค์ ๋๊ณ , ํ์ ํด๋์ค์ ๋์ง ์ด๋ฐ ๊ฒ๋ค์ ์ ํด์ง ๋งค๋ด์ผ์ด ์์ต๋๋ค -> ํ๋ก๊ทธ๋จ์ ์ค๊ณํ๋ ์ฌ๋์ ๋ชซ์ ๋๋ค.
ํ์ ํด๋์ค๋ฅผ ์์ ํด๋์ค์ ๋์ผ์ํจ
- CharDisplay, StringDisplay์ ์ธ์คํด์ค๋ค์ AbstractDisplay๋ฅผ ๋ถ๋ชจ๋ก ๋๊ณ ์์ต๋๋ค.
- ํ์ ํด๋์ค์ ํ์ ์ด ํน์ ๋์ง ์์๋ ํ๋ก๊ทธ๋จ์ด ์ ์๋ํ๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์์ ํด๋์ค ํ์ ์ ๋ณ์์ ํ์ ํด๋์ค์ ์ด๋ค ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋์ ํด๋ ์ ๋๋ก ๋์ํด์ผ ํ๋ค๋ ์์น์ ๋ฆฌ์ค์ฝํ ์นํ ์์น์ ๋ฐ๋ผ์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] State Pattern - ์ํ ํจํด (0) | 2024.07.10 |
---|---|
[Design Pattern] Mediator Pattern - ๋งค๋์์ดํฐ ํจํด (0) | 2024.06.10 |
[Design Pattern] Visitor Pattern - ๋ฐฉ๋ฌธ์ ํจํด (0) | 2024.06.10 |
[Design Pattern] Observer Pattern - ์ต์ ๋ฒ ํจํด (0) | 2024.06.09 |
[Design Pattern] Memento Pattern - ๋ฉ๋ฉํ ํจํด (0) | 2024.06.09 |