代理模式:通过代理的模式,面向用户处理的是代理对象,实例上处理的是被代理对象
代码执行:将需要代理的对象传递到代理类的初始化变量中
#被代理类
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