-
Notifications
You must be signed in to change notification settings - Fork 13
/
08_proxy_sample1.rb
67 lines (56 loc) · 1.59 KB
/
08_proxy_sample1.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# etcはRubyの標準ライブラリで、/etc に存在するデータベースから情報を得る
# この場合は、ログインユーザー名を取得するために使う
require "etc"
# 銀行の入出金業務を行う(対象オブジェクト/subject)
class BankAccount
attr_reader :balance
def initialize(balance)
@balance = balance
end
# 入金
def deposit(amount)
@balance += amount
end
# 出金
def withdraw(amount)
@balance -= amount
end
end
# ユーザーログインを担当する防御Proxy
class BankAccountProxy
def initialize(real_object, owner_name)
@real_object = real_object
@owner_name = owner_name
end
def balance
check_access
@real_object.balance
end
def deposit(amount)
check_access
@real_object.deposit(amount)
end
def withdraw(amount)
check_access
@real_object.withdraw(amount)
end
def check_access
if(Etc.getlogin != @owner_name)
raise "Illegal access: #{@owner_name} cannot access account."
end
end
end
# ===========================================
# ログインユーザーの場合
account = BankAccount.new(100)
# login_userの部分はこの処理を行うMac/Linuxのログイン中のユーザー名に書き換えて下さい
proxy = BankAccountProxy.new(account, "login_user")
puts proxy.deposit(50)
#=> 150
puts proxy.withdraw(10)
#=> 140
# ログインユーザーではない場合
account = BankAccount.new(100)
proxy = BankAccountProxy.new(account, "no_login_user")
puts proxy.deposit(50)
#=> `check_access': Illegal access: no_login_user cannot access account. (RuntimeError)