しめ鯖日記

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

Swiftで学ぶデザインパターン14 (Chain of Responsibilityパターン)

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

デザインパターンとは

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

Chain of Responsibilityパターンとは

Chain of Responsibilityパターンとは責任の鎖という意味で、複数オブジェクトに対して処理を投げて処理できるものが見つかれば処理をするというデザインパターンです。 UIKitではViewのタップ時の挙動等で使われています。

SwiftでのChain of Responsibilityパターンの実装方法

Swiftでの実装例は下の通りです。
リーダー・部長・役員の3人がいて、領収書をリーダーに渡してリーダー権限を超えていたら部長承認・それ以上なら役員承認が必要というケースを実装しました。

class Object {
    var next: Object? = nil
    var name: String { get { return "" } }
    let unlimited = 0
    
    func receiveReceipt(amount: Int) {
        if recognizableAmount() == unlimited || amount < recognizableAmount() {
            print("\(name)承認")
        } else {
            next?.receiveReceipt(amount)
        }
    }
    
    func recognizableAmount() -> Int {
        return unlimited
    }
}

class Officer: Object {
    override var name: String { get { return "役員" } }
    override func recognizableAmount() -> Int {
        return unlimited
    }
}

class Chief: Object {
    override var name: String { get { return "部長" } }
    override func recognizableAmount() -> Int {
        return 1_000_000
    }
}

class Leader: Object {
    override var name: String { get { return "リーダー" } }
    override func recognizableAmount() -> Int {
        return 100_000
    }
}

let leader = Leader()
let chief = Chief()
let officer = Officer()
leader.next = chief
chief.next = officer

leader.receiveReceipt(1_000_000)

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

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