《松本行弘的程序世界》对模板方法(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中最简单的一种了。
?
?