`

设计模式与动态语言之命令模式 Composite

阅读更多
组合模式是一种对象结构型的使用率比较高的设计模式,它的别名有部分-整体模式,合成模式.

意图:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。


动机:
  • 这些类的代码必须区别对待图元对象与容器对象,而用户认为它们是一样的。对这些类的区别使用,使用程序变得复杂。
  • 组合模式描述了如何使用递归组合,使用户不必对这些类进行区别。



适用性:
  • 想表示对象的 部分-整体层次结构
  • 希望用户忽略组合对象与单个对象的不同, 用户将统一地使用组合结构中的所有对象

结构:



效果:
  • 定义了包含简单对象和组合对象的类层次结构。简单对象可以被组合到复杂对象中,而组合的对象可以再被组合。这样客户端代码中用到简单对象的地方都可以使用组合对象
  • 简化客户端代码。客户端不用知道某对象是简单对象还是组合对象,可以以一致的方式使用这些对象
  • 更容易增加新类型的组件。新的组件可以方便地加入已有组合对象中不用改变客户端代码


误用:
只有Leaf 没有组合对象时.


附件说明: 在动态语言弱类型中,省去了用泛型来实现组合结构.

下面是个小例子,关于魔兽中物品或装备合成:

class Equip
  attr_accessor :components, :name, :attack, :defense, :level

  def initialize(options={})
    @components = []
    @level = 0
    @attack = 100
    @defense = 10
    @name = options[:name]
  end

  def upgrade
    @attack *= 1.1
    @defense *= 1.06
    @level += 1
    puts '升级成功'
  end

  def full_name
    "#{@name} LV#{@level}"
  end

  def add(c)
    @components << c
  end

  def remove(c)
    @components.delete_if{|i| i.name == c.name}
  end
end

class Material
  attr_accessor :name

  def initialize(options={})
    @name = options[:name]
  end
end

e1 = Equip.new(:name => '小刀')
e1.add(Material.new(:name => '材料1'))

e2 = Equip.new(:name => '大刀')
e2.add(e1)
e2.add(Material.new(:name => '宝石'))

e2.upgrade
puts e2.full_name



类图:



  • 大小: 48.6 KB
  • 大小: 14.6 KB
分享到:
评论

相关推荐

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

    目 录 序言 前言 读者指南 第1章 引言 1 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244

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

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

    设计模式 GOF 23

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

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

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

    设计模式--C++

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录 A 词汇表 238 附录 B 图示符号指南 241 附录 C 基本类 244 参考文献 249

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

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    设计模式(.PDF)

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

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

    最出名的设计模式,语言诙谐明了。 目 录 序言 前言 读者指南 第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种设计模式

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    设计模式文档

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

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

    第21章 独具匠心:命令模式 (Command) 第22章 步调一致:访问者模式 (Visitor) 第23章 左右逢源:调停者模式 (Mediator) 第24章 白纸黑字:备忘录模式 (Memento) 第25章 周而复始:迭代器模式 (Iterator) 第26章 ...

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

    命令模式把发出命令的责任 命令模式 和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方 独 立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收, 以及...

    设计模式 design pattern

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    JAVA经典设计模式大全

    目 录 序言 前言 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    软件设计师必读的书-设计模式

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    GoF 的 23 种设计模式

    GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一...

    设计模式___

    目 录 序言 前言 读者指南 ...6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249

    设计模式part1

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

    设计模式part2

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

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

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

Global site tag (gtag.js) - Google Analytics