代理模式:通过代理的模式,面向用户处理的是代理对象,实例上处理的是被代理对象

代码执行:将需要代理的对象传递到代理类的初始化变量中

#被代理类
class BankAccount
  attr_reader :balance

  def initialize(balance=0)
    @balance = balance
  end

  def deposit(amount)
    @balance += amount
  end

  def withdraw(amount)
    @balance -= amount
  end
end

#代理类
class BankAccountProxy
  def initialize(object)
    @object = object
  end

  def balance
    @object.balance
  end

  def deposit(amount)
    @object.deposit(amount)
  end

  def withdraw(amount)
    @object.withdraw(amount)
  end
end

account = BankAccount.new(1000)
account.deposit(1000)
p account.balance

#将被代理类的对象传递到代理类中作为初始化变量
proxy = BankAccountProxy.new(BankAccount.new(1000))
proxy.deposit(1000)
proxy.withdraw(1000)
p proxy.balance

在上面的代码中,代理对象和被代理对象有相同的方法,代理对象只是将方法执行传递给了被代理对象,本身没有处理任何事情,也是因为这种方式,通过在代理中添加代码来处理被代理对象。下面通过添加etc模块的方式来增加权限限制。

#省略BankAccount类

#改写BankAccountProxy
require 'ect'
class BankAccountProxy
  def initialize(object, owner)
    @object = object
    @owner = owner
  end

  def balance
    check_access
    @object.balance
  end

  def deposit(amount)
    check_access
    @object.deposit(amount)
  end

  def withdraw(amount)
    check_access
    @object.withdraw(amount)
  end

  def check_access
    if Etc.getlogin != @owner
      raise "can't login"
    end
  end
end

account = BankAccount.new(1000)
account.deposit(1000)
p account.balance

proxy = BankAccountProxy.new(BankAccount.new(1000), "jayzen")
proxy.deposit(1000)
proxy.withdraw(1000)
p proxy.balance

其中etc是在standard lib中,Etc.getlogin会获取系统中当前的用户名称,当前的用户名称为jayzen

results matching ""

    No results matching ""