Swift를 사용한 디자인 패턴 요약 3.Template Method 패턴

7934 단어 디자인 패턴Swift

소개



이 게시물은 증보 개정판 Java 언어로 배우는 디자인 패턴 입문을 따라 배운 것을 장별로 정리합니다.
이번에는 제 3 장 Template Method에 대해 정리합니다.

Template Method란?



Template Method는 어떤 패턴입니까?


  • 슈퍼 클래스 측에서 추상 메소드 정의
  • 슈퍼 클래스 내에서 추상 메소드를 호출하는 방법을 정의합니다. <- 여기가 "템플릿"에 해당합니다.
  • 서브 클래스 마다 추상 메소드를 정의

  • 무엇이 기뻐요?


  • 거친 처리의 흐름을 공통화할 수 있다
  • 처리 내용은 다르며 흐름은 공통 처리를 호출할 수 있다
  • 대략적인 처리 흐름의 순서 등에 변경이 생겼을 경우 쉽게 수정할 수 있다

  • 조심


  • 메소드를 호출하는 방법은 슈퍼 클래스에 구현되어 있으므로 슈퍼 클래스의 구현을 인식해야합니다.
  • 서브 클래스가 양산되기 때문에 Template Method 패턴을 너무 고집하지 않도록 주의

  • 구현 예



    목적



    이번에는 이모티콘을 출력하기위한 클래스를 만듭니다.

    이번에는 슈퍼 클래스로 Protocol를 사용했습니다.

    구현



    Emoticon 프로토콜



    이모티콘을 출력하는 데 필요한 메서드와 속성을 정의한 프로토콜

    이모티콘
    protocol Emoticon {
        /// 顔の文字列 (例: "^o^")
        var face: String { get }
        /// 顔の文字列で初期化
        init(face: String)
        /// 顔の左側の文字列 (例: "\(")
        func makeLeftSide() -> String
        /// 顔の右側の文字列 (例: ")/")
        func makeRightSide() -> String
        /// 顔文字の表示 (上記の例では "\(^o^)/" が表示される)
        func printEmoticon()
    }
    extension Emoticon {
        /// 顔文字の表示メソッドの実装
        func printEmoticon() {
            // プロトコルで定義されたまだ中身のないメソッドを使用して顔文字を作る
            // ここがテンプレート部分にあたる
            let emoticon = makeLeftSide() + face + makeRightSide()
            print(emoticon)
        }
    }
    

    Normal 클래스



    기본적인 () 로 둘러싸인 이모티콘용의 클래스입니다.

    Normal
    final class Normal: Emoticon {
        let face: String
        required init(face: String) {
            self.face = face
        }
        func makeLeftSide() -> String {
            return "("
        }
        func makeRightSide() -> String {
            return ")"
        }
    }
    

    Crab 클래스


    v()v 로 얼굴을 둘러싸인 이모티콘용 클래스입니다.
    게 클래스는 뭔가 텐션 오르지 않습니까? (?)v(`・ω・´)v에
    구현은 Normal 클래스와 같습니다.

    크랩
    final class Crab: Emoticon {
        let face: String
        required init(face: String) {
            self.face = face
        }
        func makeLeftSide() -> String {
            return "v("
        }
        func makeRightSide() -> String {
            return ")v"
        }
    }
    

    동작 확인



    구현은 이상입니다.
    실제로 Normal 클래스와 게 클래스에 샤킨의 얼굴을 전달해 보겠습니다.
    Normal(face: "`・ω・´").printEmoticon() // (`・ω・´)
    Crab(face: "`・ω・´").printEmoticon()   // v(`・ω・´)v
    

    이와 같이, 같은 printEmoticon() 메소드를 호출하고 있어, 슈퍼 클래스(이번은 프로토콜)의 내용도 같습니다만, makeLeftSide()makeRightSide() 의 구현이 다르기 때문에, 다른 내용이 출력되었습니다.

    요약



    이번에는 Template Method 패턴을 정리했습니다.

    Template Method 모양



    AbstractClass (추상 클래스) 역할



    이번에는 Emoticon 프로토콜이이 역할을했습니다.
    서브 클래스에서 정의하는 추상 메소드를 호출하는 방법과 거친 흐름을 여기에서 정의했습니다.

    ConcreteClass (구상 클래스) 역



    이번은 Normal 클래스와 게 클래스에 해당합니다.
    각각의 Emoticon 프로토콜에 불려 가는 메소드를 구현했습니다.

    클래스 다이어그램





    생각한 것


  • 기본의 기본이라고 하는 느낌의 생각이라고 생각합니다, 자연스럽게 사용해 가고 싶다.
  • 상속의 형태를 사용하기 때문에, templateMethod 내에서만 사용하고 싶은 메소드를 추상 메소드로서 정의하면 안됩니다. (그런 의미에서는 이번 구현 예는 그다지 좋지 않다)
  • 단독으로 사용하는 가정의 메소드를 추상 메소드로서 정의해야합니다 (클래스 밖에서 호출 할 수 있기 때문에)

  • 좋은 웹페이지 즐겨찾기