'''
PROXY——代理模式
跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自己的回答,接收到其他的话时再通知我回答,怎么样,酷吧。
代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
'''
容:为其他对象提供一种代理以控制对这个对象的访问。
角色:
抽象实体(Subject)
实体(RealSubject)
代理(Proxy)
适用场景:
远程代理:为远程的对象提供代理
虚代理:根据需要创建很大的对象
保护代理:控制对原始对象的访问,用于对象有不同访问权限时
优点:
远程代理:可以隐藏对象位于远程地址空间的事实
虚代理:可以进行优化,例如根据要求创建对象
保护代理:允许在访问一个对象时有一些附加的内务
'''
from abc import ABCMeta,abstractmethod
class Train(metaclass=ABCMeta):
@abstractmethod
def get_tickets(self,money):
pass
@abstractmethod
def set_tickets(self,money):
pass
class RealTrain(Train):
def __init__(self,money=150,state=False):
self.money=money
self.state=state
def get_tickets(self,money):
if self.money <= money:
self.state= True
return self.state
def set_tickets(self,money):
self.money=money
class RemoteProxy(Train):
def __init__(self):
self.train=RealTrain()
def get_tickets(self,money):
return self.train.get_tickets(money)
def set_tickets(self,money):
return self.train.set_tickets(money)
class VirtulProxy(Train):
def __init__(self):
self.train=None
def get_tickets(self,money):
if not self.train:
self.train=RealTrain()
return self.train.set_tickets(money)
def set_tickets(self,money):
if self.train is None:
return None
return self.train.set_tickets(money)
class ProtextProxy(Train):
def __init__(self):
self.train=RealTrain()
def get_tickets(self,money):
self.train.get_tickets(money)
def set_tickets(self,money):
raise PermissionError
def main():
name=input("shuru:")
if name.lower() == "protext":
train=ProtextProxy()
elif name.lower() == "virtul":
train=VirtulProxy()
else:
train=RemoteProxy()
# train.set_tickets(100)
train.get_tickets(200)
print(train.train)
# train.set_tickets(200)
# text=train.get_tickets(150)
# print(text)
if __name__ =="__main__":
main()