しめ鯖日記

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

Swiftで学ぶデザインパターン2 (Decorator パターン)

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

デザインパターンとは

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

Decorator パターンとは

Decorator パターンとはクラスの拡張に関するデザインパターンです。
継承を利用せずに既存のクラスの挙動を修正する事ができます。

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

SwiftでのDecorator パターンは下のように記述します。
まずは基本となるItemクラスを作ります。
そして次にItemを継承したRamenとトッピングやクーポンの親となるOptionクラスを作ります。

// 全ての親クラス
class Item {
    func price() -> Int {
        return 0
    }
}

// ラーメン
class Ramen: Item {
    override func price() -> Int {
        return 700
    }
}

// 各オプションの親クラス
class Option: Item {
    let item: Item
    
    init(item: Item) {
        self.item = item
    }
}

// のり
class Laver: Option {
    override func price() -> Int {
        return item.price() + 100
    }
}

// チャーシュー
class Pork: Option {
    override func price() -> Int {
        return item.price() + 200
    }
}

// 1割引きクーポン
class Coupon: Option {
    override func price() -> Int {
        return item.price() * 9 / 10
    }
}

使い方は下の通りです。
今回はノリ・チャーシュートッピングラーメンの値段とノリ・クーポン付きラーメンの値段を取得しています。
ベースとなるラーメンクラスを各オプションでラップする事でオプションの適用を行っています。

Pork(item: Laver(item: Ramen())).price() // → 1000
Coupon(item: Laver(item: Ramen())).price() // → 720

Decorator パターンの長所・短所・使いどころ

Decorator パターンの長所は複数の改変を加える事ができる点です。
継承を使う場合はノリ・チャーシュー麺を表現する場合に2回の継承が必要になって煩わしいです。
おまけにオプションの組み合わせ分の継承が必要になるのでとても手間です。
しかしDecorator パターンを使えばオプション分のクラスを作るだけなのでクラス数の増加も抑える事ができます。
継承とうまく使い分けていきたいと思います。

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

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