Swift: デザインパターン > 構造パターン > Decorator

オブジェクト設計において、定石となる手法をパターン化したものを デザインパターン といいます。
デザインパターンをきちんと勉強していない人でも、Web のおかげで知らず知らずのうちに使って(コピペして)その恩恵を享受しています。

自分自身パターン概要を一読しただけで、あいまいな使い方をしているものが多く、この際勉強を兼ねて GOF 23 パターンのなかでよく利用するものを Swift3 で記述していきたいと思います。

今回は 構造パターンDecorator について説明します。

目次

  • [構造] Decorator パターン
  • まとめ

[構造] decorator パターン

Decorator(装飾者)パターンは、既存オブジェクトに機能や振る舞いを動的に追加できるパターン。

サンプルコード

Player.swift

Component となるクラス。

class Player {
    func getAttackPoint() -> Int {
        fatalError("must be overridden")
    }
}

Hero.swift

ConcreteComponent となるクラス。

class Hero: Player {
    override func getAttackPoint() -> Int {
        return 100
    }
}

Decorator.swift

Decorator クラスには Player (Component) インスタンスをメンバ変数として保持するのがポイント。

class Decorator: Player {
    let player: Player
    
    init(_ player: Player) {
        self.player = player
    }
}

Sword.swift

ConcreteDecorator となるクラス。

class Sword: Decorator {
    override func getAttackPoint() -> Int {
        return player.getAttackPoint() + 30
    }
}

PowerStone.swift

ConcreteDecorator となるクラス。

class PowerStone: Decorator {
    override func getAttackPoint() -> Int {
        return player.getAttackPoint() + 10
    }
}

ViewController.swift

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let  attackPoint = PowerStone(Sword(Hero())).getAttackPoint()
        print("Hero ATK: \(attackPoint)")
    }
}

実行結果

Hero ATK: 140

まとめ

上記サンプルのように Decorator パターンを利用すれば、Hero クラスを継承することなく動的に機能拡張を行うことができます。

次回は 構造パターンFacade パターンを説明したいと思います。

この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

siro:chro 無料ゲーム SQN をリリースしました

img_sqn_00

sirochro 初の無料ゲームアプリ SQN をリリースしました。
記事:SQN: iOS 無料ゲームアプリ SQN - Sequential Numbers をリリース
ちょっとした時間に楽しめる完全無料のゲームなっていますので、是非ダウンロードして遊んでみてください。

↓SQN のダウンロードはこちらから

Related Contents

Pickup Contents