디자인패턴
템플릿 메서드는 부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 하는 행동 디자인 패턴입니다.
전체적으로 동일하면서 부분적으로 다른 구문으로 구성된 메서드의 코드 중복을 최소화할 때 유용하다.
행위 패턴(Behavior)중의 하나이다.
2개 이상의 클래스가 유사한 기능을 제공하면서 중복된 코드가 있는 경우에는 상속을 이용해서 코드 중복 문제를 피할 수 있다.
protocol DataMiner {
func mine()
func openFile()
func extractData()
func parseData()
func analyzeData()
func sendReport()
func closeFile()
}
extension DataMiner {
func mine() { // 프로토콜 extention은 변경을 막을 수 없다. final func 를 사용해야 템플릿 변경을 막을 수 있다. 즉, 상속을 이용해야 한다.
openFile()
extractData()
parseData()
analyzeData()
sendReport()
closeFile()
}
func analyzeData() {
print("데이터를 분석합니다.")
}
func sendReport() {
print("보고서를 보냅니다.")
}
}
class PDFDataMiner: DataMiner {
func openFile() {
print("PDF 파일을 엽니다")
}
func extractData() {
print("PDF 파일을 추출합니다")
}
func parseData() {
print("PDF 파일을 파싱합니다")
}
func closeFile() {
print("PDF 파일을 닫습니다")
}
}
class CSVDataMiner: DataMiner {
func openFile() {
print("CSV 파일을 엽니다")
}
func extractData() {
print("CSV 파일을 추출합니다")
}
func parseData() {
print("CSV 파일을 파싱합니다")
}
func closeFile() {
print("CSV 파일을 닫습니다")
}
}
class DocDataMiner: DataMiner {
func openFile() {
print("Doc 파일을 엽니다")
}
func extractData() {
print("Doc 파일을 추출합니다")
}
func parseData() {
print("Doc 파일을 파싱합니다")
}
func closeFile() {
print("Doc 파일을 닫습니다")
}
}
// MARK: - DataMiner 구현부
let docDataMiner = DocDataMiner()
let csvDataMiner = CSVDataMiner()
let pdfDataMiner = PDFDataMiner()
Client.mineData(with: pdfDataMiner)