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

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

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


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


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

[img]http://dl.iteye.com/upload/attachment/177746/c0875ff1-622b-37d5-8538-92333d5c69f7.png[/img]

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

误用:
只有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



类图:

[img]http://dl.iteye.com/upload/attachment/177864/582d421f-46f8-3db4-977d-51048e8f03aa.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值