Swift를 사용한 디자인 패턴 요약 3.Template Method 패턴
소개
이 게시물은 증보 개정판 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 클래스
기본적인 ()
로 둘러싸인 이모티콘용의 클래스입니다.
Normalfinal 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
프로토콜에 불려 가는 메소드를 구현했습니다.
클래스 다이어그램
생각한 것
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)
}
}
final class Normal: Emoticon {
let face: String
required init(face: String) {
self.face = face
}
func makeLeftSide() -> String {
return "("
}
func makeRightSide() -> String {
return ")"
}
}
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(face: "`・ω・´").printEmoticon() // (`・ω・´)
Crab(face: "`・ω・´").printEmoticon() // v(`・ω・´)v
이번에는 Template Method 패턴을 정리했습니다.
Template Method 모양
AbstractClass (추상 클래스) 역할
이번에는
Emoticon
프로토콜이이 역할을했습니다.서브 클래스에서 정의하는 추상 메소드를 호출하는 방법과 거친 흐름을 여기에서 정의했습니다.
ConcreteClass (구상 클래스) 역
이번은
Normal
클래스와 게 클래스에 해당합니다.각각의
Emoticon
프로토콜에 불려 가는 메소드를 구현했습니다.클래스 다이어그램
생각한 것
templateMethod
내에서만 사용하고 싶은 메소드를 추상 메소드로서 정의하면 안됩니다. (그런 의미에서는 이번 구현 예는 그다지 좋지 않다)Reference
이 문제에 관하여(Swift를 사용한 디자인 패턴 요약 3.Template Method 패턴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kanda_227/items/da84482a9ad328f55306텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)