しめ鯖日記

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

Swiftで学ぶデザインパターン22 (Commandパターン)

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

デザインパターンとは

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

Commandパターンとは

Commandパターンとは命令をオブジェクトとして作成し、それを順次実行するパターンです。
普通に関数を使って実行する場合と違い、命令の順番の変更や追加・削除を簡単にできる点が特徴です。

Commandパターンでは実際の命令を記述するCommand、命令を受けるReceiver、命令を保持してコントロールするInvokerの3つの役割が登場します。

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

SwiftでのCommandパターンは下のように実装します。
今回Commandクラスを作っていますが、ここは関数をCommandとみなす事も良いかと思います。

class Command {
    let receiver: Receiver
    
    init(receiver: Receiver) {
        self.receiver = receiver
    }
    
    func execute() {}
}

class HelloCommand: Command {
    override func execute() {
        receiver.action("Hello")
    }
}

class WorldCommand: Command {
    override func execute() {
        receiver.action("World")
    }
}

protocol Receiver {
    func action(message: String)
}

class PrintReceiver: Receiver {
    func action(message: String) {
        print(message)
    }
}

class Invoker {
    private var commands = [Command]()
    
    func addCommand(command: Command) {
        self.commands.append(command)
    }
    
    func execute() {
        for command in commands {
            command.execute()
        }
    }
}

let invoker = Invoker()
let receiver = PrintReceiver()
let hello = HelloCommand(receiver: receiver)
let world = WorldCommand(receiver: receiver)
invoker.addCommand(hello)
invoker.addCommand(world)

invoker.execute()

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

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