Design patterns in rubyシリーズの---strategyモード


strategyモード、javaに対して一定の理解のJE友があって、すべて熟知するべきで、ここはあまり紹介しません.
以下はrubyバージョンのstrategyモードの体現であり、Head first design設計モードの中国語バージョン第1章戦略モードを参照する.rubyはjavaに比べてインタフェースの概念も抽象クラスの概念もないが、抽象とインタフェースの応用を実現するために変相することができて、rubyの中で

#
#     
class Duck
  attr_accessor :fly_behavior, :quack_behavior 
  
  def display
    raise "this is a abstract method"
  end
  
  def perform_fly
    if fly_behavior.is_a?(FlyBehavior)
      fly_behavior.fly
    end
  end
  
  def perform_quack
    if quack_behavior.kind_of?(QuackBehavior) 
      quack_behavior.quack
    end
  end
end

#
#     
class MallarDuck < Duck
  def initialize
    @fly_behavior = FlyWithWings.new
    @quack_behavior = Quack.new
  end
  
  def display
    puts "I'm a real Mallard duck"
  end
end

#
#     
class ModelDuck < Duck
  def initialize
    @fly_behavior = FlyNoWay.new
    @quack_behavior = Quack.new
  end
  
  def display
    puts "I'm a real Model duck"
  end
end

#
#   ,          
class FlyBehavior
  def fly
    raise "Abstract method call"
  end
end

class QuackBehavior
  def quack
    raise "Abstract method call"
  end
end

#
#          
class FlyWithWings < FlyBehavior
  def fly
    puts "I'm flying!!!"
  end
end

class FlyNoWay < FlyBehavior
  def fly
    puts "I can't fly!!"
  end
end

class FlyRocketPowered < FlyBehavior
  def fly
    puts "I'm flying with a rocket"
  end
end

class Quack < QuackBehavior
  def quack
    puts "Quack!!!"
  end
end

#
#    
require 'benchmark' 
puts "strategry pattern start!!!"
mallard = MallarDuck.new
mallard.display
mallard.perform_fly
mallard.perform_quack

modeld = ModelDuck.new
modeld.display
modeld.perform_fly
modeld.fly_behavior = FlyRocketPowered.new
modeld.perform_fly


出力---------------
strategry pattern start!!!
I'm a real Mallard duck
I'm flying!!!
Quack!!!
I'm a real Model duck
I can't fly!!
I'm flying with a rocket
交流ありがとうございます!