Design patterns in rubyシリーズの---strategyモード
strategyモード、javaに対して一定の理解のJE友があって、すべて熟知するべきで、ここはあまり紹介しません.
以下はrubyバージョンのstrategyモードの体現であり、Head first design設計モードの中国語バージョン第1章戦略モードを参照する.rubyはjavaに比べてインタフェースの概念も抽象クラスの概念もないが、抽象とインタフェースの応用を実現するために変相することができて、rubyの中で
出力---------------
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
交流ありがとうございます!
以下は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
交流ありがとうございます!