💌 Design Pattern

[Design Pattern] Template Method Pattern (템플릿 메소드 패턴) with Swift

exception_log 2022. 2. 16. 23:49

안뇽하세요!@ 조이에요!@

어제도 포스팅을 하려고 했는데 말이죠..

제 맥북이... 몬터레이 업데이트를 하다가 어젯 밤에 벽돌이 되었지 뭐에요..? (털썩)

그래서 어제 밤새 눈물의 밤을 보내고..

오늘 회사에서 점심시간에 복구해왔습니다..

다들 업데이트는....신중하게 합시다....흑흑

 

아무튼! 오늘의 템플릿 메소드 패턴 시작해볼게요~!

 

TemplateMethod Pattern 개요

템플릿 메서드는 기본 클래스에서 알고리즘의 골격을 정의하고 전체 알고리즘의 구조를 변경하지 않고 하위 클래스가 단계를 재정의하도록 하는 동작 디자인 패턴이다.
 

실제 상황에서 생각해보기

  • 로직을 단계별로 나누어야 하는 상황에서 적용한다.
  • 단계별로 나눈 로직들이 앞으로 수정될 가능성이 있을 경우 더 효율적이다.
  • 부모 클래스에서 여러 메소드로 이루어진 알고리즘의 틀을 정의한다. 이 틀을 Template method라고 하며, 하위 클래스는 template method에서 단계별로 이루어진 메서드들을 override 할 수 있도록 만들어 구조를 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있도록 하는 디자인 패턴이다.
  • 조건
    • 클래스는 추상으로 만든다.
    • 단계를 진행하는 메소드는 수정이 불가능하도록 final 키워드를 추가한다.
    • 각 단계들은 외부는 막고, 자식들만 활용할 수 있도록 protected로 선언한다.
  • 장점
    • 클라이언트가 알고리즘의 특정 부분을 구현해도 알고리즘의 다른 부분은 영향을 덜 받도록 할 수 있다.
    • 중복된 코드를 슈퍼 클래스에서 한 번만 정의해도 되기 때문에 효율적이다.
  • 단점
    • 일부 클라이언트는 이미 정의된 알고리즘만 사용할 수 있기 때문에 제한받는 상황이 올 수 있다.
    • LSP를 위반할 수 있다.
    • 템플릿 메소드에 필요한 단계가 많다면 유지하기 어려울 수 있다.

 

코드로 확인해보기

// Abstract Class 
class DataMining { 
	// Template Method 
  // override 할 수 없도록 구현됨
	final func dataMining() { 
		getData() 
    	dataProcess()
    	dataAnalysis() 
  	} 
  
  	func getData() { 
    	print("데이터를 불러옵니다.") 
  	} 
  
  	func dataProcess() {
    	print("데이터 처리완료") 
  	} 
  
 	 func dataAnalysis() { 
    	print("데이터 분석완료\n") 
  	} 
}

// Concrete Class 
class PDFFileDataMining: DataMining { 
  override func getData() { 
    print("PDF File 데이터를 불러옵니다.") 
  } 
} 

// Concrete Class 
class WordFileDataMining: DataMining { 
  override func getData() { 
    print("Word File 데이터를 불러옵니다.") 
  } 
} 

// Concrete Class 
class ExcelFileDataMining: DataMining { 
  override func getData() { 
    print("Excel File 데이터를 불러옵니다.") 
  } 
}


// Client
enum FileType {
  case pdf
  case word
  case excel
}

class Client {
  static func dataMining(fileType: FileType) {
    switch fileType {
      case .pdf:
      	PDFFileDataMining().dataMining()
      case .word:
      	WordFileDataMining().dataMining()
      case .excel:
      	ExcelFileDataMining().dataMining()
    }
  }
}
반응형