Design patterns in ruby系列之---strategy模式

strategy模式,对java有一定了解的JE友,都应该熟悉,这里不作过多的介绍.
下面是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

多多交流谢谢!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值