strategy模式,对java有一定了解的JE友,都应该熟悉,这里不作过多的介绍.
下面是ruby版本的strategy模式体现,参考Head first design 设计模式中文版本第一章策略模式.由于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 设计模式中文版本第一章策略模式.由于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
多多交流谢谢!