Skip to content

Instantly share code, notes, and snippets.

@gja
Created June 30, 2012 04:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gja/3022255 to your computer and use it in GitHub Desktop.
Save gja/3022255 to your computer and use it in GitHub Desktop.
Proxy Pattern blog post
class Bank
def bank_balance(account_number)
42
end
end
bank = Bank.new
p bank.bank_balance("1234567") # ---> Gives me 42
class LogBankBalanceFilter
def initialize(bank)
@bank = bank
end
def bank_balance(account_number)
p "#{account_number} is checking balance"
balance = @bank.bank_balance(account_number)
p "the balance was #{balance}"
return balance
end
end
bank = LogBankBalanceFilter.new(Bank.new)
p bank.bank_balance("1234567") # --> "123456 is checking balance", "the balance was 42", 42
class DoubleBankBalanceFilter
def initialize(bank)
@bank = bank
end
def bank_balance(account_number)
2 * @bank.bank_balance(account_number)
end
end
bank = DoubleBankBalanceFilter.new(LogBankBalanceFilter.new(Bank.new))
p bank.bank_balance("1234567") # --> "123456 is checking balance", "the balance was 42", 84
bank = LogBankBalanceFilter.new(DoubleBankBalanceFilter.new(Bank.new))
p bank.bank_balance("1234567") # --> "123456 is checking balance", "the balance was 84", 84
class CachingFilter
def initialize(bank)
@bank = bank
@cache = {}
end
def bank_balance(account_number)
if @cache[account_number].nil?
@cache[account_number] = @bank.bank_balance(account_number)
end
@cache[account_number]
end
end
bank = LogBankBalanceFilter.new(DoubleBankBalanceFilter.new(CachingFilter.new(Bank.new)))
p bank.bank_balance("1234567") # --> "123456 is checking balance", "the balance was 84", 84,. The second call will be cached
class Filter
def initialize(obj)
@obj = obj
end
def method_missing(sym, *args)
@obj.send(sym, *args)
end
end
class FooRackMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call env
[status, headers, body]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment