Gof의 디자인 패턴 - 템플릿 메서드

Groot·2024년 8월 25일
0

TIL

목록 보기
152/153
post-thumbnail
post-custom-banner

템플릿 메서드

  • 객체의 알고리즘 뼈대만 정의하고 구체는 서브클래스 쪽으로 미룬다.
  • 알고리즘의 구조 자체는 그대로 놔둔 채 알고리즘 각 단계 처리를 서브클래스에서 재정의할 수 있게 합니다.

활용성

  • 알고리즘을 이루는 부분 중 변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브클래스에서 정의할 수 있도록 남겨두고자 할 때
  • 서브클래스 사이의 공통적인 행동을 추출하여 하나의 공통 클래스에 몰아둬서 코드 중복을 피하고 싶을 때
    • 기존 코드에서 나타나는 차이점을 뽑아 이를 별도의 새로운 연산들로 구분한다
    • 달라진 코드 부분을 새로운 연산을 호출하는 템플릿 메서드로 대체
  • 서브클래스 확장하고 싶을 때

구조

요소

  • AbstractClass: 서브클래스들이 재정의를 통해 구현해야 하는 알고리즘 처리 단계 내의 기본 연산을 정의
  • ConcreteClass: 서브클래스마다 달라진 알고리즘 처리 단계를 수행하기 위한 기본 연산을 구현

협력 방법

ConcreteClass는 AbstractClass를 통하여 알고리즘의 변하지 않는 처리 단계를 구현한다.

장점

  • 특정 알고리즘만 오버라이드하도록 하여 다른 알고리즘의 변경에 영향을 덜 받도록 한다.
  • 중복 코드를 부모 클래스로 가져올 수 있다.

단점

  • 일부 서브객체는 알고리즘을 따라야 하기 때문에 제한될 수 있다.
  • 자식 클래스를 통해 디폴트 단계 구현을 억제하여 리스코프 치환 원칙을 위반할 수 있습니다.(디폴트를 변경하거나 억제하려고 할 때)

예시 코드

import Foundation

// 상위 클래스 또는 추상 클래스 역할을 하는 클래스
class Algorithm {
    // 템플릿 메서드
    final func templateMethod() {
        step1()
        step2() // 디폴트 구현 제공
        step3()
    }
    
    // 추상 메서드 - 하위 클래스에서 구현해야 함
    func step1() {
        fatalError("This method must be overridden")
    }
    
    func step3() {
        fatalError("This method must be overridden")
    }
    
    // 디폴트 구현 제공
    func step2() {
        print("Default implementation of step 2")
    }
}

// 하위 클래스 1
class CustomAlgorithm: Algorithm {
    override func step1() {
        print("Custom step 1")
    }
    
    override func step3() {
        print("Custom step 3")
    }
    
    // step2를 비정상적으로 억제하거나 변경
    override func step2() {
        fatalError("Step 2 is not supported in CustomAlgorithm")
    }
}

// 하위 클래스 2
class AnotherAlgorithm: Algorithm {
    override func step1() {
        print("Another step 1")
    }
    
    override func step3() {
        print("Another step 3")
    }
}

// 사용 예시
let algorithms: [Algorithm] = [CustomAlgorithm(), AnotherAlgorithm()]

for algorithm in algorithms {
    algorithm.templateMethod()
}

...흠.. 그냥 프로토콜 지향 아닌가..

참고

profile
I Am Groot
post-custom-banner

0개의 댓글