论坛首页 入门技术论坛

命令模式(Command)

浏览 1813 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-12-08  
名字: 命令模式(Command)
别名: 动作(Action) 事务(Transaction)
意图: 将一个请求封装为一个对象, 从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志, 以及支持可取消的操作.
动机: 怎么做到开放扩展呢?

class Program
  def initialize
    @commands = []
  end

  def add_cmd(cmd)
    @commands << cmd
  end

  def remove_cmd(cmd)
    @commands.delete(cmd)
  end

  def run
    @commands.each do |cmd|
      cmd.execute
    end
  end
end

class File
  attr_accessor :name

  def initialize(name)
    self.name = name
  end
end

class Command
  attr_accessor :file

  def execute
    raise 'abstract method'
  end
end

class OpenFileCommand < Command
  def initialize(file)
    self.file = file
  end

  def execute
    puts "文件#{@file.name}打开"
  end
end

class CloseFileCommand < Command
  def initialize(file)
    self.file = file
  end

  def execute
    puts "文件#{@file.name}关闭"
  end
end

program = Program.new
afile = File.new("A file")
bfile = File.new("B file")

open_a_cmd = OpenFileCommand.new(afile)
close_a_cmd = CloseFileCommand.new(afile)
open_b_cmd = OpenFileCommand.new(bfile)
close_b_cmd = CloseFileCommand.new(bfile)

program.add_cmd(open_a_cmd)
program.add_cmd(close_a_cmd)
program.add_cmd(open_b_cmd)
program.add_cmd(close_b_cmd)
program.remove_cmd(close_b_cmd)

program.run





  • 大小: 41.5 KB
   发表时间:2009-12-08   最后修改:2009-12-08
puts "文件A file打开\n文件A file关闭\n文件B file打开"
7 请登录后投票
论坛首页 入门技术版

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