有没有人有使用命令的复合材料在Ruby的一个很好的例子? 这是我所看到的各种设计模式文学这听起来相当强大提及,但一直没能找到任何有趣的使用情况或代码设计模式的混合。
Answer 1:
由总体思路和启发在这篇博客文章的样本模式实现 ,这里是它可能看起来像一个刺:
class CompositeCommand
def initialize(description, command, undo)
@description=description; @command=command; @undo=undo
@children = []
end
def add_child(child); @children << child; self; end
def execute
@command.call() if @command && @command.is_a?(Proc)
@children.each {|child| child.execute}
end
def undo
@children.reverse.each {|child| child.undo}
@undo.call() if @undo && @undo.is_a?(Proc)
end
end
并使用样品使用量的软件安装程序中的应用:
class CreateFiles < CompositeCommand
def initialize(name)
cmd = Proc.new { puts "OK: #{name} files created" }
undo = Proc.new { puts "OK: #{name} files removed" }
super("Creating #{name} Files", cmd, undo)
end
end
class SoftwareInstaller
def initialize; @commands=[]; end
def add_command(cmd); @commands << cmd; self; end
def install; @commands.each(&:execute); self; end
def uninstall; @commands.reverse.each(&:undo); self end
end
installer = SoftwareInstaller.new
installer.add_command(
CreateFiles.new('Binary').add_child(
CreateFiles.new('Library')).add_child(
CreateFiles.new('Executable')))
installer.add_command(
CreateFiles.new('Settings').add_child(
CreateFiles.new('Configuration')).add_child(
CreateFiles.new('Preferences')).add_child(
CreateFiles.new('Help')))
installer.install # => Runs all commands recursively
installer.uninstall
Answer 2:
我想了解这种模式我自己,一直在思索什么事情都有可能被模仿这种方式。
Composite模式的基本思想就是项目和集合需要处理,在某些方面,以同样的方式的情况。 集合可以包含的项目和子集合的混合物,深深为你喜欢的嵌套。
有些想法我已经(借用一些从Ruby的设计模式和红宝石在显微镜下 ):
一个文件系统
你可以要求它的大小的文件,并返回一个简单的值。 您也可以要求一个文件夹,它的大小,并返回它的文件和子文件夹的大小之和。 该子文件夹的过程中返回他们的文件和子文件夹的总和。
同样,这两个文件和文件夹可以移动,重命名,删除,备份,压缩等。
系统命令
一个命令对象可以具有run
方法。 这种方法可以通过运行任意数量的子,其中有子等的工作,如果所有的子命令返回true,它可能返回true,可以报告基于其儿童统计统计(时间流逝,修改过的文件等)。
一个公司的层次结构
个人,团队,部门和整个企业都可以被看作是有工资,带来的收入,完成一个工作单位等。
阿军单元
在一场比赛中,一名士兵可能有防守和进攻的统计数据,可以说移动到的位置,攻击基地等军团和师可以同样的方式对待。
重量或货币价值
一个完整的箱货车的重量包括每个箱子的重量。 每个盒的重量包括它的每个物品,它们的部件等的重量
同样,金融投资组合的货币价值是其所有资产的价值。 其中一些资产可能包含多个股票指数基金。 你可以买入或卖出某只股票或整个投资组合。
GUI元素
窗口可以由帧,其由帧,其由帧中的。 任何元素都可以定位,阴影,专注,隐蔽等
在编程语言表达
当Ruby解释器计算表达式,它被分解为表达式树(抽象语法树),并评估每个那些,通过其工作的方式回到了树的顶端来终值这样做。 从某种意义上说,树的每一级都问同样的问题:“你有什么价值”
作为简单的示例,在发现的值的第一步骤((4 + 8) * 2)) + 9
是找到的值4 + 8
。