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也可以通过元编程来做--相比较而言还是比较麻烦),在普通情况下不是很容易去实现调用处代码的灵活编写,使得在调用处的代码较耦合,不易扩展。