しめ鯖日記

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

Swiftで学ぶデザインパターン18 (Mediatorパターン)

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

デザインパターンとは

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

Mediatorパターンとは

Mediatorパターンとはオブジェクト同士のメッセージのやり取りに関するデザインパターンです。
先日勉強したObserberパターンと近いものになります。

このデザインパターンではMediatorとColleagueいうクラスが登場します。
Colleagueが複数存在し、Mediatorは全てのColleagueの参照を持っています。
そしてあるColleagueから他のColleagueへのメッセージ送信は全てMediatorを経由するようになります。
これによって柔軟性は欠けますがメッセージのやりとりをシンプルにする事ができます。

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

SwiftでのMediatorパターンは下のように実装します。
Colleagueが3つあり、それらの仲介役のMediatorが1つ存在します。

protocol Mediator {
    func run()
}

class ConcreteMediator: Mediator {
    var colleagues: [Colleague] = []
    
    func addColleague(colleague: Colleague) {
        colleagues.append(colleague)
    }
    
    func run() {
        for colleague in colleagues { colleague.runForMediator() }
    }
}

class Colleague {
    weak var mediator: ConcreteMediator? = nil
    init(mediator: ConcreteMediator) {
        self.mediator = mediator
        mediator.addColleague(self)
    }
    func run() {}
    func runForMediator() {}
}

class ConcreteColleague1: Colleague {
    override func run() {
        print("その1を実行")
        mediator?.run()
    }
    override func runForMediator() {
        print("その1が呼ばれた")
    }
}

class ConcreteColleague2: Colleague {
    override func run() {
        print("その2を実行")
        mediator?.run()
    }
    override func runForMediator() {
        print("その2が呼ばれた")
    }
}

class ConcreteColleague3: Colleague {
    override func run() {
        print("その3を実行")
        mediator?.run()
    }
    override func runForMediator() {
        print("その3が呼ばれた")
    }
}

let mediator = ConcreteMediator()

let colleague1 = ConcreteColleague1(mediator: mediator)
let colleague2 = ConcreteColleague2(mediator: mediator)
let colleague3 = ConcreteColleague3(mediator: mediator)

colleague1.run()
colleague2.run()
colleague3.run()

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

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