しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftで学ぶデザインパターン9 (Adapterパターン)

今回はAdapterパターンについて書いていきます。

デザインパターンとは

デザインパターンとはソフトウェア開発の設計方法の事です。
オブジェクト指向における再利用のためのデザインパターン』という本が出典で、全部で23種類のパターンが紹介されています。

Adapterパターンとは

Adapterパターンとは複数のクラスに共通インターフェイスを持たせるパターンです。
既存のクラスに手を加えずに実装を追加するような形になるのでライブラリの修正には良さそうです。

SwiftでのAdapterパターンの実装方法

継承を利用した方法

例としてTargetというクラスがあり、そのクラスを修正したくないけどmethod2を実装したいパターンを考えます。
更にmethod2Targetmethod1を呼び出す実装だと仮定します。
その場合はTargetクラスのサブクラスを作ってそれにmethod2を追加すれば当初の想定は満たせそうです。
実装は下のとおりになります。

protocol MyProtocol {
    func method2()
}

class Target {
    func method1() {
        print(1)
    }
}

class Adapter: Target, MyProtocol {
    func method2() {
        super.method1()
    }
}

let a = Adapter()
a.method2()

委譲を利用した方法

継承でなく委譲を使う場合は下のようになります。
Adapterインスタンス変数としてTargetを持つことでmethod1を内部で呼び出せています。

protocol MyProtocol {
    func method2()
}

class Target {
    func method1() {
        print(1)
    }
}

class Adapter: MyProtocol {
    let target = Target()
    
    func method2() {
        target.method1()
    }
}

let a = Adapter()
a.method2()

Swiftの機能を使って似た事を行う

Swiftでは既存クラスにプロトコルメソッドを追加するので、Adapterを作らずに同等の事を実装できます。
実装方法は下の通りです、エクステンションを使ってTargetmethod2を追加しています。

protocol MyProtocol {
    func method2()
}

class Target {
    func method1() {
        print(1)
    }
}

extension Target: MyProtocol {
    func method2() {
        method1()
    }
}

let t = Target()
t.method2()

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン