思考问题:
我的感觉代理模式和门面模式感觉一模一样,没什么区别?怎么破?
共同点:都是在客户端和访问对象之间加入中介,
例子1:找周星驰代言--控制对周星驰的访问
我是客户端:假如我要找周星驰做广告代言人,但是我不能找周星驰本人,只能找他的代理。
# 演员类
class Actor(object):
def __init__(self):
self.isBusy = False
self.name = "周星驰"
def occpied(self):
self.isBusy = True
print(self.name, "没空,正在拍摄电影")
def available(self):
self.isBusy = False
print(self.name, "有空,可以谈合约")
def getStatus(self):
return self.isBusy
# 代理类
class Agent(object):
def __init__(self):
self.principal = None
def work(self):
self.actor = Actor()
if self.actor.getStatus():
self.actor.occupied()
else:
self.actor.available()
if __name__ == '__main__':
r = Agent() # 找来周星驰的代理,
r.work() #让代理替周星驰工作,事实上这个工作并不是由代理完成的,真正做事的也是周星驰本人。
现实例子2:控制对银行的访问
我要去买衣服,结果现金不够了,但是还不想去银行取钱,只能让代理帮我付款了。但是真正付款的人还是银行。
# coding:utf-8
from abc import ABCMeta, abstractmethod
# 主题
class Payment(metaclass=ABCMeta):
@abstractmethod
def do_pay(self):
pass
# 真实主题
class Bank(Payment):
def __init__(self):
self.card = None
self.account = None
def __getAccount(self):
self.account = self.card #假定卡号就是账户
return self.account
def __hasFunds(self):
print("银行:核对账户", self.__getAccount(), "余额足够")
return True
def setCard(self, card):
self.card = card
def do_pay(self):
if self.__hasFunds():
print("银行:: 商家付款")
return True
else:
print("银行:: 对不起,余额不足")
return False
# 代理
class DebitCard(Payment):
def __init__(self):
self.bank = Bank()
def do_pay(self):
card = input("代理:: 输入卡号")
self.bank.setCard(card)
return self.bank.do_pay()
# 客户端,我,我的成员变量里面应该有银行代理这个对象才对,
#成员变量可以直接用self.表示,当然也可以用列表括起来,
class You:
def __init__(self):
print("客户端:: 让我买一件T恤衫")
self.debitCard = DebitCard()
self.isPurchased = None
def make_payment(self):
self.isPurchased = self.debitCard.do_pay()
def __del__(self):
if self.isPurchased:
print("客户端:: 哇!这件衣服是我的了 :-)")
else:
print("客户端:: 我的余额不足,sorry :-(")
you = You()
you.make_payment()