Python设计模式--代理模式

 

参考博客

思考问题:

我的感觉代理模式和门面模式感觉一模一样,没什么区别?怎么破?

共同点:都是在客户端和访问对象之间加入中介,

例子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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值