`

设计模式与动态语言 之 策略模式(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语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    Java设计模式 设计模式介绍

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

    [行为模式] head first 设计模式之策略模式(strategy)

    在`Head First 设计模式之策略模式`中,作者通过易于理解的方式讲解了如何在实际编程中应用策略模式。博客可能涵盖了以下内容: 1. **问题背景**:通常,当一个类有多种可能的行为,并且这些行为在不同场景下需要...

    24种设计模式以及混合设计模式

    通过学习和应用这些设计模式,开发者不仅可以提高代码的可读性、可维护性和可扩展性,还能提升团队间的沟通效率,因为设计模式是软件工程中的通用语言。对于任何有志于提升软件开发水平的人来说,理解和掌握设计模式...

    设计模式之蝉

    Java语言的使用则说明了这本书所涉猎的设计模式是与Java开发紧密相关的内容。 根据提供的信息,这本书的第二版由机械工业出版社出版,于2014年发行,ISBN号为978-7-111-43787-1。书中包含了作者的个人读书笔记,这...

    设计模式 在java语言中的应用

    行为型模式,如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility),关注对象间如何交互和职责分配。策略模式使算法族能够互换,而观察者模式让多个对象可以订阅一个主题,当...

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    设计模式之美—学习笔记

    设计模式之美在于它们是软件设计的通用语言,无论你使用哪种编程语言,都能通过这些模式与他人进行有效的沟通。通过深入学习和实践,我们可以不断提升自己的设计能力,写出更加优雅、高效和可复用的代码。记住,设计...

    android应用开发设计模式之-策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java编程语言中,尤其是在Android平台上,这种模式能够使我们的代码更加灵活、可扩展且易于维护。 策略模式的核心思想是定义一系列算法,并将每个...

    java设计模式;java语言描述;经典的设计模式

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者...策略模式(Strategy)、模板方法模式(Template Method)和访问者模式(Visitor)...

    设计模式之单件模式、工厂模式、策略模式、观察者模式(php描述)(资料整理)

    本文将深入探讨四种常见的设计模式:单件模式(Singleton)、工厂模式(Factory)、策略模式(Strategy)和观察者模式(Observer),并以PHP语言为背景进行解释。 首先,我们来看单件模式。单件模式确保一个类只有...

    设计模式培训-strategy

    ### 设计模式培训-strategy #### 一、设计模式概览 设计模式是软件工程领域的一个重要概念,它提供了一套解决常见问题的有效方法。在软件开发的过程中,开发者经常会遇到相似的问题,这些问题往往有着类似的解决...

    JAVA_Strategy.rar_java 策略模式、工厂模式、桥接模式_severalgdo_strategy

    在软件设计模式的世界里,Java 语言提供了丰富的工具来实现各种设计模式,如标题和描述中提到的策略模式、工厂模式以及桥接模式。这些模式是面向对象设计的重要组成部分,帮助开发者解决复杂的问题,提高代码的灵活...

    设计模式:Java语言中的应用.zip

    在Java语言中,设计模式的应用广泛且至关重要,因为它们能帮助开发者遵循良好的编程原则,如开闭原则、单一职责原则、依赖倒置原则等。 首先,我们来看一些基本的设计模式类型: 1. 创建型模式:这类模式主要处理...

    设计模式 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。...同时,还可以学习如何通过组合多种策略,实现更复杂的行为,以及如何使用工厂模式或依赖注入等其他设计模式与策略模式配合使用。

    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 ...

    c#设计模式

    C#设计模式是针对C#编程语言的特定设计模式应用,它们是经验丰富的开发者们在面对软件设计时总结出的一系列可重用解决方案。这里我们将深入探讨23个经典设计模式,并了解它们在C#中的应用。 1. 创建型模式:这类...

    23种面向对象设计模式

    3. **行为型模式**(Behavioral Patterns):关注对象之间的责任分配和通信,包括策略模式(Strategy)、模板方法模式(Template Method)、迭代器模式(Iterator)、观察者模式(Observer)、访问者模式(Visitor)...

    设计模式中的策略模式

    在Java等面向对象编程语言中,策略模式允许我们在运行时动态选择不同的算法或策略,而不必在编译时就决定。这种灵活性使得系统更具扩展性和可维护性。 设计模式是软件开发中的一种最佳实践,它总结了过去的经验教训...

Global site tag (gtag.js) - Google Analytics