《松本行弘的程序世界》对模板方法(Template method)的说明非常清晰:
在父类的一个方法中定义算法的框架,其中几个步骤的具体内容则留给子类来实现。
?
比如一个用于公司欢迎同事的程序:
?
class A
def initialize
@name = "jinbin"
@word = "hello"
end
def say_word
puts "Welcome to New Company"
puts "#@word,#@name"
end
end
a=A.new
a.say_word
?
?某天,需求忽然增加了,不仅要适用于公司,还需要适用于学校。Still easy:
?
class A
def initialize
@name = "jinbin"
@word = "hello"
end
def say_word symbol
if symbol == "company"
puts "Welcome to New Company"
elsif symbol == "school"
puts "Welcome to New School"
end
puts "#@word,#@name"
end
end
a=A.new
a.say_word "company"
a.say_word "school"
?
然后又有一天,需求又变了,原来的欢迎词太单调了,希望针对不同场景设计不同的欢迎词;然后又希望能增加对医院、法院等等场景的支持,然后又有一天,希望你能支持欢迎多人的工作。。。
OK!我们冷静一下,思考下最基本的问题,什么是在变的?什么是保持不变的?
场景在变,以及对应的欢迎词在变化,但是欢迎词的输出步骤没有变化,一段描述性文字,再加上个人信息。OK,我们将变与不变的部分分离开。
?
class A
def initialize
@name = "jinbin"
@word = "hello"
end
def say_word
say_welcome
say_personal
end
def say_welcome
raise "Called abstract method : say_welcome"
end
def say_personal
raise "Called abstract method : say_personal"
end
end
class Company_welcome < A
def say_welcome
puts "Welcome to New Company"
end
def say_personal
puts "#@word,#@name"
end
end
a=Company_welcome.new
a.say_word
?
no matter 你的场景怎么变,我只需要根据你的需求编写继承类中对应的方法就OK了。
?
Template Method Pattern 也许是GoF pattern中最简单的一种了。

?
?