특정 연산의 절차는 유지하지만 구체적인 행동은 서브 클래스에 위임하는 패턴입니다.

 

1️⃣ 활용성

변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브 클래스에서 정의할 수 있도록 남겨두고자 할 때 활용할 수 있는 패턴입니다.

 

2️⃣ 패턴 참여자

  • AbstractClass: 변하지 않는 절차를 구현합니다. 그리고 서브 클래스가 재정의해야할 연산에 대해 기본 구현을 제공합니다.
  • ConcreteClass: 구체적인 연산방식을 결정하고 필요한 함수를 재정의 합니다.

 

3️⃣ Swift구현

구현시 유의할 점

  • 재정의할 수 있는 연산에 대해 특별한 네이밍을 부여할 수 있습니다.
    • 'do-' 같은 프리픽스를 제공하면 가독성이 향상됩니다.

먼저 추상 클래스를 구현합니다.

start함수의 경우 고정된 절차를 실행하는 매서드로 재정의가 되지 않도록 합니다.

class AbstractClass {
    
    final func start() {
        if !doCheckCache() {
            doDownload()
        }
    }
    
    func doCheckCache() -> Bool { fatalError() }
    func doDownload() { fatalError() }
}

 

서브 클래스를 구현합니다.

final class ConcreteClass: AbstractClass {
    override func doCheckCache() -> Bool {
        
        // check cache
        
        return true
    }
    override func doDownload() {
        
        // download
        
    }
}

 

 

7️⃣ 느낀점

해당 패턴은 팩토리 매서드 패턴의 상위 개념이라고 생각했습니다.

팩토리 매서드 패턴은 행동을 제정의 하기 보단 사용할 구체적인 타입을 반환하는 매서드를 재정의 한다는 점에서 목적상 차이가 있지만 개념은 유사합니다.

 

해당 패턴은 상속을 통해 다형성을 추구하는 좋은 패턴중 하나라고 생각됩니다.

코드 재사용을 위한 상속이 아닌 자식이 부모를 완전히 대체할 수 있는 리스코프치환원칙을 잘 준수하는 패턴이라고 생각되기 때문입니다.

리스코프 치환 원칙이 잘 지켜진다는 것은 새로운 하위 타입이 기존 상위 타입을 완전히 대체할 수 있다는 의미이며, 이는 결과적으로 클라이언트 코드의 수정 없이 기능을 확장할 수 있음을 보여줍니다.

따라서 LSP의 준수는 OCP(개방-폐쇄 원칙)가 잘 지켜지고 있다는 강력한 간접적 증거가 됩니다.

 

 

구현 코드는 아래 저장소에서 확인할 수 있습니다.

 

GitHub - J0onYEong/GOF-design-pattern: GOF디자인 패턴 실습코드 레포지토리입니다.

GOF디자인 패턴 실습코드 레포지토리입니다. Contribute to J0onYEong/GOF-design-pattern development by creating an account on GitHub.

github.com