Swift で Adapter パターンを書いてみる
オブジェクト指向の勉強でデザインパターンの勉強をしております。 Java で書かれてるコードを Swift で書き換えます。
継承、委譲のパターンがあるようなのでそれぞれ記載。
まずは継承パターンから。
// ターゲット protocol Print { func printWeak() func printStrong() }
// アダプティー(元々用意されているもの) class Banner { private let string: String init(string: String) { self.string = string } func showWithParen() { print("(" + string + ")") } func showWithAster() { print("*" + string + "*") } }
// アダプターの役(このクラスに適合させる) class PrintBanner: Banner, Print { func printWeak() { showWithParen() } func printStrong() { showWithAster() } }
// クライアント let p = PrintBanner(string: "Hello") p.printWeak() p.printStrong()
実行結果
(Hello) *Hello*
委譲パターン
// ターゲット protocol Print { func printWeak() func printStrong() }
// アダプティー(元々用意されているもの) class Banner { private let string: String init(string: String) { self.string = string } func showWithParen() { print("(" + string + ")") } func showWithAster() { print("*" + string + "*") } }
// アダプター class PrintBanner: Print { let banner: Banner init(string: String) { self.banner = Banner(string: string) } func printWeak() { banner.showWithParen() } func printStrong() { banner.showWithAster() } }
// クライアント let p = PrintBanner(string: "Hello") p.printWeak() p.printStrong()
実行結果
(Hello) *Hello*
Swift は extension で 「Swift らしく」書けるようなので、そちらも。
// ターゲット protocol Print { func printWeak() func printStrong() }
// アダプティー(元々用意されているもの) class Banner { private let string: String init(string: String) { self.string = string } func showWithParen() { print("(" + string + ")") } func showWithAster() { print("*" + string + "*") } }
extension Banner: Print { func printWeak() { showWithParen() } func printStrong() { showWithAster() } }
// クライアント let p = Banner(string: "Hello") p.printWeak() p.printStrong()
実行結果
(Hello) *Hello*
extension が一番スマートな気もするが......。 まだなんとなく書いている感が抜けんなー。 引き続き勉強していこう。
参考