3
1

More than 3 years have passed since last update.

Swiftでデザインパターン【Adapter】

Last updated at Posted at 2020-08-25

元ネタ → ochococo/Design-Patterns-In-Swift

クラス図

image.png

図の引用元:Wikipedia: Adapter パターン

概要

The adapter pattern is used to provide a link between two otherwise incompatible types by wrapping the "adaptee" with a class that supports the interface required by the client.
Adapterパターンは、クライアントが必要とするインターフェースをサポートするAddapterクラスを用意してAdapteeをラップすることにより、2つの互換性のないタイプ間のリンクを提供するために使用されます。

サンプルコード

// Target
protocol NewDeathStarSuperlaserAiming {
    // requiredMethod() propertyだがgetterメソッドという扱い
    var angleV: Double { get }
    var angleH: Double { get }
}

// Adaptee
struct OldDeathStarSuperlaserTarget {
    // oldMethod() propertyだがgetterメソッドという扱い
    let angleHorizontal: Float
    let angleVertical  : Float

    init(angleHorizontal: Float, angleVertical: Float) {
        self.angleHorizontal = angleHorizontal
        self.angleVertical   = angleVertical
    }
}

// Adapter
struct NewDeathStarSuperlaserTarget: NewDeathStarSuperlaserAiming {

    // adaptee: Adaptee
    private let target: OldDeathStarSuperlaserTarget

    // requiredMethod(): this.adaptee.oldMethod()
    // Targetに準拠した形式でAdapteeからの戻りをラップする
    var angleV: Double {
        return Double(target.angleVertical)
    }
    var angleH: Double {
        return Double(target.angleHorizontal)
    }

    init(_ target: OldDeathStarSuperlaserTarget) {
        self.target = target
    }
}


// usage //

let target    = OldDeathStarSuperlaserTarget(angleHorizontal: 14.0, angleVertical: 12.0)
let newFormat = NewDeathStarSuperlaserTarget(target)

newFormat.angleH
newFormat.angleV

クラス図との対応

サンプルコード クラス図
NewDeathStarSuperlaserAiming Target
angleV, angleH requiredMethod()
サンプルコード クラス図
OldDeathStarSuperlaserTarget Adaptee
angleHorizontal, angleVertical oldMethod()
サンプルコード クラス図
NewDeathStarSuperlaserTarget Adapter
target adaptee: Adaptee
angleV, angleH requiredMethod()  #this.adaptee.oldMethod()

考察

Adapteeは既存の何らかのクラス。それ自体には変更を加えずにAdapterを用意してラップすることでクライアントが使用できるようにする。TargetAdapteeから必要な機能をラップする具体的なインタフェースを定義する。ここでは、OldDeathStarSuperlaserTargetFloatを返すメソッド(getプロパティ)をインタフェース(protocol)で抽出して、Doubleを返すようにラップしている。インタフェースを抽出して定義しているのは、Doubleを返す形式で、他のクラスと同等に、OldDeathStarSuperlaserTargetの機能を取り込みたいためである。Targetに準拠させることでOldDeathStarSuperlaserTarget以外にも互換性のない様々なクラスを同等に使用することが可能になる。

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1