デリゲートパターン

最近、Swiftを勉強していて、デリゲートパターンが よく使われているのでブログにまとめておきます。

デリゲートパターンとは

Delegateとは日本語で 委譲 を意味します。 日本語の意味する通り、デリゲートパターンとは 他者(他クラス)に規定した処理(Swiftではプロトコルが使われる)を委譲することを意味します。

code例

コード例は以下の通りとなります。

// プロトコルを宣言
protocol HouseWorkDelegate {
  func startHouseWork()
  func cleanRoom()
  func makeDish()
  func finishHouseWork()
}

//  
class Employer {
  var Servant:HouseWorkDelegate? = nil
  func doWork() {
      if let sv = self.Servant {
        sv.startHouseWork()
        sv.cleanRoom()
        sv.makeDish()
        sv.finishHouseWork()
      } else {
        print("今日は使用人がいないので家事をはじめます")
        print("掃除をします")
        print("料理を作ります")
        print("家事、終わります。自分で作る料理はうまくない")
      }
  }
}

class Servant : HouseWorkDelegate {
  func startHouseWork() {
    print("使用人が家事をはじめます")
  }
  func cleanRoom() {
    print("掃除をします")
  }
  func makeDish() {
    print("料理を作ります")
  }
  func finishHouseWork() {
    print("家事、終わります。美味しい料理ができました!")
  }
}

var employer = Employer()
var servant = Servant()

// 主人が家事をする
employer.doWork()

// 使用人が家事をする
employer.Servant = servant
employer.doWork()

解説

今回は家事を行う設計を書いています。 プロトコルでは家事を以下のメソッドを規定しています。

  • startHouseWork()
  • cleanRoom()
  • makeDish()
  • finishHouseWork()

ここで重要なのはメソッドを規定するだけで実際に処理を 委譲するのはどのクラスでも問題ないということです。 今回のケースではServantが委譲先ですが、プロトコルに規定した 関数を実装すれば、どんなクラスでも、どんな実装でも構いません。

Swiftではボタンアクションなどを作成することが多いですが、その際にはデリゲートパターンが効力を発揮します。 例えば、ボタンを押したら音が鳴る、ボタンを押して画面遷移などなど。

参考

Delegateについてのまとめ - エムティーアイ エンジニアブログ