论坛首页 编程语言技术论坛

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

浏览 1422 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-09   最后修改:2010-01-13
组合模式是一种对象结构型的使用率比较高的设计模式,它的别名有部分-整体模式,合成模式.

意图:将对象组合成树形结构以表示“部分-整体”的层次结构。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
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics