#每天一种设计模式# 模板方法 _Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > #每天一种设计模式# 模板方法

#每天一种设计模式# 模板方法

 2011/9/29 8:03:57  Goldice  http://jdoc.iteye.com  我要评论(0)
  • 摘要:《松本行弘的程序世界》对模板方法(Templatemethod)的说明非常清晰:在父类的一个方法中定义算法的框架,其中几个步骤的具体内容则留给子类来实现。比如一个用于公司欢迎同事的程序:classAdefinitialize@name="jinbin"@word="hello"enddefsay_wordputs"WelcometoNewCompany"puts"#@word,#@name"endenda=A.newa.say_word某天,需求忽然增加了,不仅要适用于公司,还需要适用于学校
  • 标签:

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


?

?

  • 大小: 33.3 KB
  • 查看图片附件
  • 相关文章
发表评论
用户名: 匿名