责任链模式比较好理解,这里以域名解析为例说明一下。
我们知道域名解析(也即DNS解析)是由近到远逐级进行的,它一般会经过如下几个步骤:
- 查找本地hosts文件,若有,则返回,没有,则下一步
- 查找本地DNS服务器(路由器),若有,则返回,没有,则下一步
- 查找区域内的DNS服务器(如深圳),若有,则返回,没有,则下一步
- ……
就这样一级一级,直到能解析出ip为止。按照这个思路我们去实现它,先定义责任链(各dns服务器)
# 抽象DNS服务父类
class AbstractDnsServer:
__next_server = None # 下一级
def resolve(self, domain):
pass
def set_next(self, next_server):
self.__next_server = next_server
def get_next(self):
return self.__next_server
# 本地hosts
class HostsDnsServer(AbstractDnsServer):
def resolve(self, domain):
if random.random() < 0.5:
print('本地hosts解析')
return '115.28.87.149'
else:
return self.get_next().resolve(domain)
# 局域网dns服务器
class LANDnsServer(AbstractDnsServer):
def resolve(self, domain):
if random.random() < 0.5:
print('局域网dns服务器解析')
return '115.28.87.149'
else:
return self.get_next().resolve(domain)
# 根dns服务器
class RootDnsServer(AbstractDnsServer):
def resolve(self, domain):
print('dns根服务器解析')
return '115.28.87.149'
构造场景:
if __name__ == '__main__':
hostsDnsServer = HostsDnsServer()
lanDnsServer = LANDnsServer()
rootDnsServer = RootDnsServer()
hostsDnsServer.set_next(lanDnsServer)
lanDnsServer.set_next(rootDnsServer)
for i in range(3):
ip = hostsDnsServer.resolve("www.f2boy.com")
print('解析结果', ip)
print()
执行结果:
本地hosts解析
解析结果 115.28.87.149
dns根服务器解析
解析结果 115.28.87.149
本地hosts解析
解析结果 115.28.87.149