GoF์ ๋์์ธ ํจํด, ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ๋ํด ์์๋ณธ๋ค.
ํด๋น ๊ธ์, ๋ค์์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
ํต์ฌ ์์ฝ
- ํ๋์ ๊ธฐ๋ฅ์ ์ํํ๋๋ฐ ๋จ๊ณ๊ฐ ์ ํด์ ธ ์์ ์ (ํ ํ๋ฆฟ)
- ์ด๋ฅผ ๊ตฌํ๊ณผ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ํจํด
์์
Code
main
//
// main.swift
// TemplateMethod
//
// Created by Choiwansik on 2023/02/21.
//
import Foundation
internal func main() {
let title = "ํ
ํ๋ฆฟ ๋ฉ์๋"
let content = [
"ํ๊ณ ์๋๋ฐ ์กธ๋ฆฌ๋ค์ใ
",
"์ผ๋ง ๋จ์ง ์์์ผ๋ ๋์ ๋ด์ผํฉ๋๋ค..",
"์ค๋์ 230221",
"๋ฒ์จ 2์",
]
let footer = "๋๋ ์์"
let article = Article(title: title, content: content, footer: footer)
let simple = SimpleDisplayArticle(article: article)
let caption = CaptionDisplayArticle(article: article)
simple.display()
print()
caption.display()
}
main()
ํ
ํ๋ฆฟ ๋ฉ์๋
ํ๊ณ ์๋๋ฐ ์กธ๋ฆฌ๋ค์ใ
์ผ๋ง ๋จ์ง ์์์ผ๋ ๋์ ๋ด์ผํฉ๋๋ค..
์ค๋์ 230221
๋ฒ์จ 2์
๋๋ ์์
Title: ํ
ํ๋ฆฟ ๋ฉ์๋
Content:
ํ๊ณ ์๋๋ฐ ์กธ๋ฆฌ๋ค์ใ
์ผ๋ง ๋จ์ง ์์์ผ๋ ๋์ ๋ด์ผํฉ๋๋ค..
์ค๋์ 230221
๋ฒ์จ 2์
Footer: ๋๋ ์์
Article
//
// Article.swift
// TemplateMethod
//
// Created by Choiwansik on 2023/02/21.
//
import Foundation
public struct Article {
internal let title: String
internal let content: [String]
internal let footer: String
}
DisplayArticleTemplate
//
// DisplayArticleTemplate.swift
// TemplateMethod
//
// Created by Choiwansik on 2023/02/21.
//
import Foundation
internal protocol DisplayArticleTemplate {
func display()
func title()
func content()
func footer()
}
extension DisplayArticleTemplate {
internal func display() {
self.title()
self.content()
self.footer()
}
}
SimpleDisplayArticle
//
// SimpleDisplayArticle.swift
// TemplateMethod
//
// Created by Choiwansik on 2023/02/21.
//
import Foundation
internal class SimpleDisplayArticle: DisplayArticleTemplate {
internal init(article: Article) {
self.article = article
}
internal func title() {
print(self.article.title)
}
internal func content() {
self.article.content.forEach { print($0) }
}
internal func footer() {
print(self.article.footer)
}
private let article: Article
}
CaptionDisplayArticle
//
// CaptionDisplayArticle.swift
// TemplateMethod
//
// Created by Choiwansik on 2023/02/21.
//
import Foundation
internal class CaptionDisplayArticle: DisplayArticleTemplate {
internal init(article: Article) {
self.article = article
}
internal func title() {
print("Title: \(self.article.title)")
}
internal func content() {
print("Content: ")
self.article.content.forEach { print($0) }
}
internal func footer() {
print("Footer: \(self.article.footer)")
}
private let article: Article
}
ํ์ฉ์ฑ
- ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ ๊ณ ์ ๋์ด ์์ผ๋, ์ผ๋ถ ๋จ๊ณ๊ฐ ๋ค์ํ ๊ตฌํ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ.
- ์ฌ๋ฌ ํด๋์ค์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด ์์ ๋, ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ.
- ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ์ ์ผ๋ถ ๋จ๊ณ๋ ๊ณ ์ ๋์ด ์์ง๋ง, ๋ค๋ฅธ ์ผ๋ถ ๋จ๊ณ๋ฅผ ์ ํ์ ์ผ๋ก ์ํํด์ผ ํ ๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ.
๊ฒฐ๊ณผ
- hook ์ฐ์ฐ์ ํตํด, ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ถ ๋จ๊ณ๋ฅผ ์ ํ์ ์ผ๋ก ์ํํ ์ ์๋ค.
- ์ฝ๋ ์ค๋ณต์ ์ ๊ฑฐํ ์ ์๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค.
- ๊ฐ ๋จ๊ณ์ ์ฑ ์์ ๋ช ํํ ํ ์ ์๋ค.
๋ค๋ง, ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋จํ ๊ฒฝ์ฐ, ๊ตณ์ด ์ด ํจํด์ ์ฌ์ฉํ ํ์๋ ์๋ค.