今回は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 パターンを使えばオプション分のクラスを作るだけなのでクラス数の増加も抑える事ができます。
継承とうまく使い分けていきたいと思います。
- 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 1999/10
- メディア: 単行本
- 購入: 21人 クリック: 711回
- この商品を含むブログ (210件) を見る