goat’s village(wonderful IT life)

IT でエンジニア人生謳歌しちゃう村

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 が一番スマートな気もするが......。 まだなんとなく書いている感が抜けんなー。 引き続き勉強していこう。

参考

www.amazon.co.jp