`

设计模式与动态语言 之 策略模式(strategy)

阅读更多
策略模式还有个别名叫政策模式(Policy),属对象行为型模式。


意图:定义一系列算法,把它们一个个封闭起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化

动机:把算法硬编写在使用他们的类中是不合适的。

不合适的地方有:
  • 代码乱
  • 多余的引用
  • 修改困难
  • 不好测试



适用性:
  • 许多相关的类仅仅是行为不同
  • 需要使用一个算法的不同变体
  • 一个类定义了多种行为,并且这些行为在操作用以多个条件语句的形式出现。


结构:



在动态语言里边(如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 等。

效果:
  • 使算法或行为可重用
  • 继承有助于取出这些算法的公共功能
  • 算法实现与Context分离,易切换,理解,扩展
  • 算法委托给父类,省去部分Case
  • 方便单元测试


用该模式应注意:
  • 环境对象和策略对象的接口弄错。将完整一致的,可独立的工作移出环境对象, 然后用策略对象来代理它。
  • 注意,如果你将你的环境对象和某一个策略对象过紧耦合,而无法设计中推出第二个和第三个策略对象, 那就是误用
  • 切换时必须了解不同的Strategy


看了上面的介绍大家可能会觉得策略模式跟前面讲到的模板方法没什么区别,不就都是将算法封装吗?下面讲下他们的区别:

  • 策略模式用组合,模版模式用继承,说白了就是一个封装一组算法(多算法),一个封装一个算法(单算法)。
  • 模版模式就是算法在父类中,子类不会完全改写算法,可以改写部分,或称关键部分,但整体的算法不变,可以节省大量代码
  • 策略侧重不同的行为的改变在统一的接口下,强调多态下面行为的执行过程,处理过程,可以从用户那里接受参数,只要用户提供的策略符合接口
  • 策略模式所有的算法均在子类中完成,强调行为即算法的不同,可以使程序更灵活,而模版模式中子类不能改变父类算法结构.


下面是一个例子:

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)


源码文件点击下载

类图:


  • 大小: 95.2 KB
  • 大小: 17.4 KB
分享到:
评论

相关推荐

    Java设计模式 设计模式介绍

    2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、设计模式之Strategy(策略) 10、设计模式之...

    GOLF设计模式(C++语言版)

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract ...

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    本书从一个新的视角描述面向对象设计,将面向中对象编程的原则与运用设计模式力量创建健壮、可靠的软件开发环境结合起来。书中采用实用、恰当的例子,指导读者用模式解决普通的编程问题,并且解释现代软件设计模式的...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    设计模式 GOF 23

    设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...

    设计模式:可复用面向对象软件的基础--详细书签版

    设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...

    设计模式--C++

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory 模式 ...

    《设计模式》中文版(23个设计模式的介绍与运用)

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

    ASP.NET设计模式-杨明军译(源码)

    《asp.net设计模式》涵盖了开发企业级asp.net应用程序的知名模式和最佳实践。本书用到的模式可以用于从asp.net1.0到asp.net 4.0的任何版本。不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。  ...

    设计模式(.PDF)

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

    设计模式精解-掌握设计模式

    本书从一个新的视角描述面向对象设计,将面向中对象编程的原则与运用设计模式力量创建健壮、可靠的软件开发环境结合起来。书中采用实用、恰当的例子,指导读者用模式解决普通的编程问题,并且解释现代软件设计模式的...

    《国外写的,翻译版本》设计模式

    最出名的设计模式,语言诙谐明了。 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

    设计模式文档

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

    PHP设计模式之策略模式原理与用法实例分析

    本文实例讲述了PHP设计模式之策略模式原理与用法。分享给大家供大家参考,具体如下: 策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。 策略模式指的是...

    C#23种设计模式_示例源代码及PDF

    多 迭代子模式 个对象聚在一起形成的总体称之为聚集, 聚集对象是能够包容一组对象的容器对象。 迭代 子 模式将迭代逻辑封装到一个独立的子对象中, 从而与聚集本身隔开。 迭代子模式简化了聚集 的界面。每一个聚集...

    [源代码] 《易学 设计模式》 随书源代码

    第19章 明修栈道,暗度陈仓:策略模式 (Strategy) 第20章 循序渐进:职责链模式 (ChainofResponsibility) 第21章 独具匠心:命令模式 (Command) 第22章 步调一致:访问者模式 (Visitor) 第23章 左右逢源:调停者模式...

    设计模式精解 译者:熊节 程序员必看书籍之一 part1

    本书从一个新的视角描述面向对象设计,将面向中对象编程的原则与运用设计模式力量创建健壮、可靠的软件开发环境结合起来。书中采用实用、恰当的例子,指导读者用模式解决普通的编程问题,并且解释现代软件设计模式的...

    Strategy模式

    采用java语言实现 设计模式 中的 策略模式,其中包含整个java工程

    设计模式 design pattern

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

Global site tag (gtag.js) - Google Analytics