PROXY——代理模式

'''

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

猜你喜欢

转载自blog.csdn.net/weixin_42040854/article/details/80613098
今日推荐