[์ค์ํํธ ๋์์ธํจํด] ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด(Template Method Pattern)
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณจ๊ฒฉ์ ์ ์ํฉ๋๋ค. ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ถ ๋จ๊ณ๋ฅผ ์๋ธํด๋์ค์์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ์๊ณ ๋ฆฌ์ฆ์ ํน์ ๋จ๊ณ๋ฅผ ์๋ธํด๋์ค์์ ์ฌ์ ์ํ ์๋ ์์ต๋๋ค.
- ํค๋ํผ์คํธ ๋์์ธ ํจํด
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ๋จ๊ณ์ ์ธ ๊ณผ์ ์ ๊ฐ์ง๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ถ์์ ์ผ๋ก ์ ์ํ๊ณ , ๊ทธ ์ค ์ผ๋ถ๋ฅผ ์๋ธ ํด๋์ค์์ ํ์์ ๋ฐ๋ผ ์ง์ ๊ตฌํํ ์ ์๊ฒ ํฉ๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ํ์๊ฐ์ ์ ๊ตฌํํ๋ค๊ณ ํ๋ค๋ฉด, ์๋์ฒ๋ผ ๋จ๊ณ๋ฅผ ๋๋ ์ ์๊ฒ ์ฃ .
- ์์ด๋๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- ์ค๋ณต๊ฒ์ฌ๋ฅผ ํ๋ค.
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- ๋น๋ฐ๋ฒํธ ๊ท์น์ ํ์ธํ๋ค.
- ๋น๋ฐ๋ฒํธ๋ฅผ ๋ค์ ์ ๋ ฅ๋ฐ๋๋ค.
- ๋ ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋์ง ํ์ธํ๋ค.
- ๊ฐ์ ์๋ฃ๋ฅผ ํ์ํ๋ค.
์ด ๋, ๋ง์ฝ ์ํฉ์ ๋ฐ๋ผ ๋น๋ฐ๋ฒํธ ๊ท์น๋ง ๋ฌ๋ผ์ ธ์ผ ํ๋ค๋ฉด ์ด๋จ๊น์? ๋๊ฐ์ ๊ณผ์ ์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๋ ๊ฒ๋ณด๋ค๋ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๊ฒ ๊ณ , ํ์ํ ๋ถ๋ถ๋ง ์ฌ์ ์ํ ์ ์๋ค๋ฉด ์ข๊ฒ ์ฃ . ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ด์ฉํด์ ํ๋ฒ ๋ฌธ์ ๋ฅผ ํ์ด๋ด ์๋ค.
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด ์ดํดํ๊ธฐ
UML์ ๊ฐ๋จํ๊ฒ ๊ทธ๋ ค๋ดค๋๋ฐ์, ์ค์ํํธ์ ๋ง์ถฐ์ ํ๋ ค๋ ์ฝ์ง ์์ ๋ถ๋ถ์ด ์๋ค์.. AbstractClass ํ๋กํ ์ฝ์ ํ๋กํ ์ฝ์ด์ง๋ง ๋ค๋ฅธ ๊ฐ์ฒด์งํฅ ์ธ์ด์์ ์ ๊ณตํ๋ ์ถ์ ํด๋์ค์ ์ญํ ์ ํ๊ฒ๋ฉ๋๋ค. templateMethod๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด ์๊ณ ๋ฆฌ์ฆ์ ์์ํ ์ ์๋๋ก ํ๊ณ , ๊ฐ ๋จ๊ณ๋ณ๋ก ์งํ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ฃ .
์ธํฐํ์ด์ค๊ฐ ์๋ ์ถ์ ํด๋์ค๋ก ์ ์๊ฐ ๋์ด ์๋ ์ด์ ๋ ์ ์์์ ์ค๋ช ํ๋ "์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ถ ๋จ๊ณ" ๋๋ฌธ์ธ๋ฐ์, ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ ๋จ๊ณ๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ผ๋ถ๋ง ์ฌ์ ์ํ ์ ์๋๋ก ๊ณตํต๋๋ ๋จ๊ฒ์ ๋ํ ๊ตฌํ์ ์ถ์ ํด๋์ค์์ ์ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค. ์ค์ํํธ๋ ์ถ์ ํด๋์ค๊ฐ ์์ผ๋ protocol๋ก ์ ์ธํ๊ณ extension์ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์๊ฒ ๋ค์.
ํ์๊ฐ์ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ์ดํดํ๋๋ก ํ์๊ฐ์ ํ๋ก๊ทธ๋จ์ ํ๋ฒ ๊ตฌํํด๋ณผ๊ฒ์.
protocol RegistrationSupportable {
// template method
func register()
// steps
func inputId()
func validateId()
func inputPassword()
func validatePassword()
func reinputPassword()
func validateReInputPassword()
func presentSuccess()
}
extension RegistrationSupportable {
func register() {
inputId()
validateId()
inputPassword()
validatePassword()
reinputPassword()
validateReInputPassword()
presentSuccess()
}
}
๋จผ์ ์ถ์ํด๋์ค์ ์ญํ ์ ํ ํ๋กํ ์ฝ์ธ RegistrationSupportable ํด๋์ค๋ฅผ ๋ง๋ค์์ด์. ๊ทธ๋ฆฌ๊ณ ํ ํ๋ฆฟ ๋ฉ์๋๊ฐ ๋ register ๋ฉ์๋์ ๋ํ ์ ์๋ฅผ extension์ ์ถ๊ฐํด์ฃผ์์ต๋๋ค. ๊ฐ ๋จ๊ณ๋ณ ์๊ณ ๋ฆฌ์ฆ์ ์์ง ๊ตฌํ์ด ๋์ด์์ง ์์ง๋ง, ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ํ์ธํ๋ฉด ํ์๊ฐ์ ์ด ์ด๋ค ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ์งํ๋ ์ง ํ์ธํ ์ ์์ฃ .
๊ทธ๋ผ ์ด์ ๊ณตํต๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ๋ฉ์๋๋ก ์ ์ํด๋ณผํ ๋ฐ์, ์์ด๋์ ํจ์ค์๋์ ๊ท์น์ ํ์ธํ๋ ๋ถ๋ถ ๋ง๊ณ ๋ ๋ชจ๋ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ์ฃ ? ๊ตฌํํด์ค์๋ค. ํธ์๋ฅผ ์ํด์ ์ค์ ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์ง๋ ์๊ณ ์ถ๋ ฅ๋ฌธ์ผ๋ก ๋์ฒดํ ๊ฒ์.
extension RegistrationSupportable {
func register() {
inputId()
validateId()
inputPassword()
validatePassword()
reinputPassword()
validateReInputPassword()
presentSuccess()
}
func inputId() {
print("input id")
}
func inputPassword() {
print("input password")
}
func reinputPassword() {
print("reinput password")
}
func validateReInputPassword(){
print("password and repassword should be identical")
}
func presentSuccess() {
print("Success!")
}
}
์ด์ ๋ ๊ฐ์ง ์ํฉ์ ๋ฐ๋ผ ๋น๋ฐ๋ฒํธ์ ์์ด๋๋ฅผ ๊ฒ์ฌํ๋ ๋ถ๋ถ๋ง ์ฌ์ ์๋ ์ ์๋๋ก ํ๋ ค๊ณ ํ๋๋ฐ์, ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์๊ฒฉํ๊ฒ ๊ฒ์ฌํ๋ ์๋๋ฆฌ์ค์ธ StrongRegistration๊ณผ ์๊ฒฉํ์ง ์๊ฒ ๊ฒ์ฌํ๋ LooseRegisration์ ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค.
final class LooseRuleRegistration: RegistrationSupportable {
func validatePassword() {
print("password should be more than 1 letter")
}
func validateId() {
print("id should be more than 1 letter and alphanumeric letters are allowed")
}
}
final class StrongRuleRegistration: RegistrationSupportable {
func validatePassword() {
print("password should be more than 8 letters. At leat 2 speical characters should be included")
}
func validateId() {
print("id should be more than 5 letter and only alphabet is allowed")
}
}
๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ validatePassword์ validateId ๋ฉ์๋๋ง ๊ฐ๊ฐ ์ฌ์ ์๋ฅผ ํด์ฃผ์์ด์.
์ฌ์ฉํด๋ณผ๊น์?
let weakReg = LooseRuleRegistration()
weakReg.register()
// input id
// id should be more than 1 letter and alphanumeric letters are allowed
// input password
// password should be more than 1 letter
// reinput password
// password and repassword should be identical
// Success!
let strongReg = StrongRuleRegistration()
strongReg.register()
// input id
// id should be more than 5 letter and only alphabet is allowed
// input password
// password should be more than 8 letters. At leat 2 speical characters should be included
// reinput password
// password and repassword should be identical
// Success!
์ด๋ ๊ฒ ๋ค๋ฅธ ๋ชจ๋ ๋จ๊ณ๋ ๋์ผํ์ง๋ง ์ผ๋ถ๋ง ์ฌ์ ์๋์ด์ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์๊ณ ๋ฆฌ์ฆ์ ๋จ๊ณ๋ฅผ ํ๋์ ํ์ ํ ์ ์๊ฒ ํ๊ณ ๊ทธ ์ค ์ผ๋ถ๋ง์ ์ฌ์ ์ํด ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ์ ์ฉํ ํจํด์ด์๋๋ฐ์, ์ฌ์ค ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํด์ผํ ์ง๋ ๊ฐ์ด ์ ์์ค๋ค์. ์ง๊ธ ๋๋ ์๊ฐ์ ์ด๋ค ๋จ๊ณ๊ฐ ์ ํด์ ธ์๊ณ , ๋ ๊ฐ ์ด์์ ์ํฉ์์ ์ผ๋ถ ๋จ๊ณ๋ง ๋ค๋ฅธ ๋์์ผ๋ก ์งํ๋์ด์ผํ ๋, ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ์ธ๋ถ์์๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ ์๊ฐ ๋์๋์ง ์๋์ง ์์ง ๋ชปํ ์ํ๋ก ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ ๊ฒ ๊ฐ์์. ์ ์์ ์์ ํด๋ผ์ด์ธํธ๋ register๋ง ํธ์ถํ๋ฉด ๋๋ ๊ฒ ์ฒ๋ผ์.
๊ทธ๋ผ ์ด๋ง ์ค์ด๊ฒ ์ต๋๋ค. ์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
'๐ฎ ์จ-์์ค > ๐ ๋์์ธํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote