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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值