Python实现设计模式--10.责任链模式(Chain of Responsibility Pattern)

责任链模式比较好理解,这里以域名解析为例说明一下。

我们知道域名解析(也即DNS解析)是由近到远逐级进行的,它一般会经过如下几个步骤:

  1. 查找本地hosts文件,若有,则返回,没有,则下一步
  2. 查找本地DNS服务器(路由器),若有,则返回,没有,则下一步
  3. 查找区域内的DNS服务器(如深圳),若有,则返回,没有,则下一步
  4. ……

就这样一级一级,直到能解析出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

 

你可能感兴趣的:(设计模式-python)