[iOS 8] Swiftでデザインパターン No.3 Adapter – 委譲

2014.10.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Adapter

Adapter パターンは、既存クラスを修正することなく、異なるインタフェースを持たせるためのパターンです。

今回は委譲を利用した方法で実装します。

前回はこちら

クラス図

Adapter-delegate2

ポイント

  • Adapter は Adaptee のインスタンスをメンバ変数として持っている
  • Adapter の requiredMethod() の中身は、メンバ変数 adaptee の oldMethod() 呼び出し
    • adaptee に処理を委譲している

サンプルコード

Target

class Target {
    func requiredMethod() {
        fatalError("must be overridden")
    }
}

今回 Target はプロトコルではなく、抽象クラスです。

Adaptee

class Adaptee {
    func oldMethod() {
        println(__FUNCTION__)
    }
}

こちらは変わらず。

Adapter

class Adapter: Target {
    private let adaptee = Adaptee()

    override func requiredMethod() {
        adaptee.oldMethod()
    }
}

Adapter は、メンバ変数として Adaptee のインスタンスを持ちます。
requiredMethod() の中身は、adaptee に処理を委譲して oldMethod() を呼び出しているだけです。
adaptee.oldMethod()self.adaptee.oldMethod() とも書けます。
(私は今のところ self を付けない方向で行こうと思っています。)

実行

Adapter().requiredMethod()

実行結果

oldMethod()

まとめ

  • メンバ変数にアクセスするときは、self を付けても付けなくてもよい