设计模式——代理模式

代理模式作为结构型设计模式,用于提供对象访问的控制层。它创建了一个代理对象来控制对实际对象的访问,例如在远程代理中允许客户端通过代理访问远程服务器,或者在虚拟代理中优化资源消耗。此模式可以降低系统耦合度,并实现访问权限的控制。示例展示了如何通过代理控制上网冲浪,当访问特定网站时,代理会切换到公网IP。
摘要由CSDN通过智能技术生成

结构型模式

代理模式

定义

  • 为其他对象提供一种代理以控制对这个对象的访问
  • 当客户不方便直接访问一个对象或者不满足需要时,提供一个替身对象来控制这个对象的访问,客户实际上访问的是替身对象

实现方式

场景
  • 通过代理上网冲浪
from abc import ABC, abstractmethod


# ----------------------抽象实体----------------------
class Browser(ABC):
    def __init__(self, ip, url):
        self.ip = ip
        self.url = url

    @abstractmethod
    def surfing_the_internet(self):
        """上网冲浪"""
        pass


# ----------------------具体实体----------------------
class Chrome(Browser):
    def surfing_the_internet(self):
        if self.url == "https://www.chrome.com" and self.ip == "192.168.221.120":
            print(f"无法访问外网,当前IP:{self.ip}...")
            return
        print(f"通过{self.ip}访问了{self.url}冲浪")


# ------------------------代理------------------------
class Agent(Browser):
    def __init__(self, ip, browser, url=None):
        # 需要被代理的对象
        self.browser = browser
        super().__init__(ip, url)

    def surfing_the_internet(self):
        result = self.dest_check()
        if not result:
            # 如果发现访问的是外网,则将ip更换为公网ip
            self.browser.ip = self.ip
            print(f"当前访问的是外网,通过代理IP访问")
        self.browser.surfing_the_internet()

    def dest_check(self):
        if self.browser.url == "https://www.chrome.com":
            return False
        return True


if __name__ == '__main__':
    c = Chrome("192.168.221.120", "https://www.chrome.com")
    c.surfing_the_internet()

    # 通过代理上网
    a = Agent("134.98.220.139", c)
    a.surfing_the_internet()
无法访问外网,当前IP:192.168.221.120...
当前访问的是外网,通过代理IP访问
通过134.98.220.139访问了https://www.chrome.com冲浪
优点
  1. 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

  2. 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。

  3. 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。

  4. 保护代理可以控制对真实对象的使用权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值