浏览 1681 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-11
最后修改:2010-01-13
意图:定义一系列算法,把它们一个个封闭起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化 动机:把算法硬编写在使用他们的类中是不合适的。 不合适的地方有:
适用性:
结构: 在动态语言里边(如Ruby),可以没有父类,用Proc和代码块可以简单实现策略模式 如: hello = lambda { puts "I am a proc" } hello.call def run_it puts "before" yield puts "after" end run_it do puts "I am a yield" end 在Ruby中还有很多轻量级策略对象,像 sort map select each 等。 效果:
用该模式应注意:
看了上面的介绍大家可能会觉得策略模式跟前面讲到的模板方法没什么区别,不就都是将算法封装吗?下面讲下他们的区别:
下面是一个例子: class Hero def kill(bug, skill) skill.do(bug) end end # 技能 class Skill def do(bug="bug") raise "This is abstract method" end end # 雷电 class Thunder < Skill def do(bug="bug") puts '延迟3秒' puts '闪电2下' puts '连续的打雷' puts "#{bug} 减血1000" end end # 地震 class Earthquake < Skill def do(bug) puts "#{bug} 减血500" puts '连续的地震波2秒' puts "#{bug} 眩晕5秒" end end # 旋风 class Whirlwind < Skill def do(bug) puts '范围100 旋风5秒并移动' puts "#{bug} 连续减血150/每秒 " end end puts "\r\n" puts '打猪' puts "------------" Hero.new.kill('小猪', Thunder.new) puts "\r\n" puts '打小白' puts "------------" Hero.new.kill('小白', Earthquake.new) puts "\r\n" puts '打牛' puts "------------" Hero.new.kill('大牛', Whirlwind.new) 源码文件点击下载 类图: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |