代理模式
在某些应用中,我们需要在访问某个对象之前执行一个或多个重要的操作,例如,访问敏感信息——在允许用户访问敏感信息之前,我们希望确保用户具备足够的权限。操作系统也存在类似的情况,用户必须具有管理员权限才能在系统中安装新程序。
下面以观众通过经纪人观看运动员比赛说明代理模式:
定义一个抽象类:
定义一个抽象方法run();
class IRunner(object):
def run(self):
pass
定义一个运动员类继承抽象类:
运动员为刘翔,并开始跑步;
class runer(IRunner):
def __init__(self):
self.name = '刘翔'
def run(self):
print('%s跑步'%self.name)
代理类
代理刘翔与观众接触,决定运动员是不是跑步
class proxy(IRunner):
def __init__(self):
self.IRunner = runer()
self.list = [True, False]
def run(self):
if random.choice(self.list):
print("经纪人同意")
self.IRunner.run()
else:
print('经纪人不同意')
场景类
class client(unittest.TestCase,object):
def test_watch_runner(self):
manger = proxy()
manger.run()
优化
虽然此时代理类可以代理运动员进行跑步,但只能代理刘翔一个运动员,这不符合逻辑,现在有一个需求:
观众想看博尔特跑步,代码实现方式:
运动员:
class runer(IRunner):
def __init__(self,name):
self.name = '%s'%name
def run(self):
print('%s跑步'%self.name)
代理人:
class proxy(IRunner):
def __init__(self,name):
self.name= name
self.IRunner = runer(name)
self.list = [True, False]
def run(self):
if random.choice(self.list):
print("%s经纪人同意"%self.name)
self.IRunner.run()
else:
print('%s经纪人不同意'%self.name)
场景类:
class client(unittest.TestCase,object):
def test_watch_runner(self):
manger = proxy('博尔特')
manger.run()
优化后观众可以想看哪个运动跑步都可以。
总结:
优化前
运行结果有两种:
1.经纪人不同意,无法看到比赛
2.经纪人同意,刘翔跑步
优化后:
1.博尔特经纪人同意博尔特跑步
2.博尔特经纪人不同意