gpt4 book ai didi

ruby - 命令设计模式的组合

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:02 25 4
gpt4 key购买 nike

有人在 Ruby 中有使用命令组合的好例子吗?这是我在各种设计模式文献中看到的设计模式混合体,听起来很强大,但一直未能找到任何有趣的用例或代码。

最佳答案

受总体思路和the sample pattern implementations in this blog post启发,下面是它的外观:

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

关于ruby - 命令设计模式的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10560892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com