デザインパターン勉強の一貫として、Commandパターンについて調べたのでまとめてみました。それと、CommandパターンをRubyで書いてみました。
Commandパターンとは
- 振る舞いに関するパターン(GoF)
- 動作とそれに伴うパラメータをカプセル化したもの
- あるオブジェクトに対してコマンドを送ることでそのオブジェクトのメソッドを呼び出すこと
- 命令・操作をクラス(オブジェクト)で表現し、オブジェクトを切り替えることで操作の切り替えを実現する
- 命令を実行する
Commandパターンのメリット
- 既存のコードを修正することなく機能拡張できること
- クラスの再利用性を向上させること
Rubyで書いてみた
Command(命令)
class BattleCommand
def initialize
@battle = BattleReceiver.new()
end
def battle()
end
end
ConcreateCommand(具体的な命令)
class Fight < BattleCommand
def battle()
@battle.battle_fight
end
end
class Magic < BattleCommand
def battle()
@battle.battle_magic
end
end
class Flee < BattleCommand
def battle()
@battle.battle_flee
end
end
Receiver(受信者)
class BattleReceiver
def battle_fight
puts 'Fight'
end
def battle_magic
puts 'Magic'
end
def battle_flee
puts 'Flee'
end
end
Invoker(起動者)
class Controller
def fight
battle(Fight.new)
end
def magic
battle(Magic.new)
end
def flee
battle(Flee.new)
end
private
def battle(command)
command.battle
end
end
Client(依頼者)
class BattleClient
def initialize()
@controller = Controller.new
end
def fight
@controller.fight
end
def magic
@controller.magic
end
def flee
@controller.flee
end
end
battle = BattleClient.new
battle.fight
battle.magic
battle.flee
実行結果
$ ruby command.rb
Fight
Magic
Flee
参考
命令をクラスにするCommandパターン - 感謝のプログラミング 10000時間
「Rubyによるデザインパターン」の要点と使いどころ#Commandパターン - Qiita
【デザインパターン】コマンドパターン - datchの日記
コマンド Ruby 2.0.0 デザインパターン速攻習得[Command][Design Pattern] - 酒と泪とRubyとRailsと