[iOS] Template Method 패턴

Wongbing·2022년 11월 9일
0

Design Pattern

목록 보기
2/2
post-thumbnail
tags: 디자인패턴

템플릿 메서드는 부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 하는 행동 디자인 패턴입니다.

  • 전체적으로 동일하면서 부분적으로 다른 구문으로 구성된 메서드의 코드 중복을 최소화할 때 유용하다.

  • 행위 패턴(Behavior)중의 하나이다.

  • 2개 이상의 클래스가 유사한 기능을 제공하면서 중복된 코드가 있는 경우에는 상속을 이용해서 코드 중복 문제를 피할 수 있다.

스위프트에서 적용

  • 비슷한 기능을 하는 두개이상의 객체가 존재하게 되었다.
  • Protocol로 중복되는 메서드를 뽑아 공통 인터페이스를 만들어준다.
  • 공통구현은 Extension을 통해 기본구현을 해준다.
  • 채택하는 객체마다 다르게 적용해야될 부분은 기본구현을 하지 않는다.

예시코드

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)

장점

  • 클라이언트들이 대규모 알고리즘의 특정 부분만 오버라이드하도록 하여 그들이 알고리즘의 다른 부분에 발생하는 변경에 영향을 덜 받도록 할 수 있습니다.
  • 중복 코드를 부모 클래스로 가져올 수 있습니다.

단점

  • 일부 클라이언트들은 알고리즘의 제공된 골격에 의해 제한될 수 있습니다.
  • 당신은 자식 클래스를 통해 디폴트 단계 구현을 억제하여 리스코프 대체 원칙을 위반할 수 있습니다.
  • 템플릿 메서드들은 단계들이 더 많을수록 유지가 더 어려운 경향이 있습니다.

🔗 References

profile
IOS 앱개발 공부

0개의 댓글