オブジェクト設計において、定石となる手法をパターン化したものを デザインパターン といいます。
デザインパターンをきちんと勉強していない人でも、Web のおかげで知らず知らずのうちに使って(コピペして)その恩恵を享受しています。
自分自身パターン概要を一読しただけで、あいまいな使い方をしているものが多く、この際勉強を兼ねて GOF 23 パターンのなかでよく利用するものを Swift3 で記述していきたいと思います。
今回は 構造パターン の Decorator について説明します。
目次
- [構造] Decorator パターン
- まとめ
[構造] decorator パターン
Decorator(装飾者)パターンは、既存オブジェクトに機能や振る舞いを動的に追加できるパターン。
サンプルコード
Player.swift
Component となるクラス。
[code]
class Player {
func getAttackPoint() -> Int {
fatalError(“must be overridden”)
}
}
[/code]
Hero.swift
ConcreteComponent となるクラス。
[code]
class Hero: Player {
override func getAttackPoint() -> Int {
return 100
}
}
[/code]
Decorator.swift
Decorator クラスには Player (Component) インスタンスをメンバ変数として保持するのがポイント。
[code]
class Decorator: Player {
let player: Player
init(_ player: Player) {
self.player = player
}
}
[/code]
Sword.swift
ConcreteDecorator となるクラス。
[code]
class Sword: Decorator {
override func getAttackPoint() -> Int {
return player.getAttackPoint() + 30
}
}
[/code]
PowerStone.swift
ConcreteDecorator となるクラス。
[code]
class PowerStone: Decorator {
override func getAttackPoint() -> Int {
return player.getAttackPoint() + 10
}
}
[/code]
ViewController.swift
[code]
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let attackPoint = PowerStone(Sword(Hero())).getAttackPoint()
print(“Hero ATK: \(attackPoint)”)
}
}
[/code]
実行結果
[code]
Hero ATK: 140
[/code]
まとめ
上記サンプルのように Decorator パターンを利用すれば、Hero クラスを継承することなく動的に機能拡張を行うことができます。
次回は 構造パターン の Facade パターンを説明したいと思います。
この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。