首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

ruby设计形式-模板方法模式

2012-10-19 
ruby设计模式--模板方法模式ruby的模板方法模式与java的大致一致,其主要概念是定义一个抽象的算法骨架,而

ruby设计模式--模板方法模式

ruby的模板方法模式与java的大致一致,其主要概念是定义一个抽象的算法骨架,而让一些步骤的具体实现遗留到子类去完成,通过面向对象继承的特性来将系统中变化与不变的部分相分离,从而使得整个程序更灵活更具有扩展性。

?

?

class Car    attr_accessor :name, :door_size    def initialize(name, door_size)    @name = name    @door_size = door_size  end    def car_break    break_before    do_break    break_after    end    def break_before    p "called super method(before)"  end    def break_after    p "called super method(after)"  end    def do_break    raise "called super do_break"  end  endclass Lamborghini < Car    def break_before    p "do the car button"  end    def break_after    p "loose the car button"  end    def do_break    p"wring the button"  end  endclass Ferrari < Car  def break_before    p "tread foot board"  end    def break_after     p "pull foot board"  end    def do_break    p "using hand to toggle the selector"  endend#car = Car.new("name", 4)#car.car_break 直接调用模板方法会抛出自定义异常#调用兰博基尼的刹车car = Lamborghini.new("name", 4)car.car_break#调用法拉利的刹车car = Ferrari.new("name", 4)car.car_break

?声明3个类,其中父类为汽车Car,两个子类为法拉利和兰博基尼,在父类定义了一个算法骨架break,break中的具体实现被延迟到了子类中去实现,这里父类也实现了模板方法中的算法步骤(before和after方法),这样当子类不定义的时候,默认父类也能提供具体步骤的实现,这样的方法我们称之为钩子方法(hook method)。

从该设计模式可以看出,因为刹车本身算法中存在变化的部分,使用模板方法模式将变化的部分抽离到了子类中完成,而将核心不变的部分留在了父类,当系统发生改变的时候,只需要取创建一个新的类来应对新的变化即可,满足了开闭设计原则。

缺点:使用继承的特性不是最优的方法,使子类和父类有一定的耦合,并且父类的所有方法几乎都有可能会暴露到子类当中,另外一方面,当系统发生改变的时候在运行时来切换不同的刹车方法会比较困难(JAVA中可以使用动态绑定+配置文件来做,ruby也可以通过元编程来做--相比较而言还是比较麻烦),在普通情况下不是很容易去实现调用处代码的灵活编写,使得在调用处的代码较耦合,不易扩展。

热点排行