안뇽하세요!@ 조이에요!@
어제도 포스팅을 하려고 했는데 말이죠..
제 맥북이... 몬터레이 업데이트를 하다가 어젯 밤에 벽돌이 되었지 뭐에요..? (털썩)
그래서 어제 밤새 눈물의 밤을 보내고..
오늘 회사에서 점심시간에 복구해왔습니다..
다들 업데이트는....신중하게 합시다....흑흑
아무튼! 오늘의 템플릿 메소드 패턴 시작해볼게요~!
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()
}
}
}
반응형
'💌 Design Pattern' 카테고리의 다른 글
[Design Pattern] Observer Pattern (옵저버패턴) with Swift (0) | 2022.02.22 |
---|---|
[Design Pattern] Factory Method Pattern (팩토리메소드패턴) with Swift (0) | 2022.02.18 |
[Design Pattern] Singleton Pattern (싱글톤패턴) with Swift (0) | 2022.02.14 |
[Design Pattern] Adapter Pattern (어댑터패턴) with Swift (0) | 2022.02.13 |
[Design Pattern] SOLID (0) | 2022.02.13 |