结构型模式
代理模式
定义
- 为其他对象提供一种代理以控制对这个对象的访问
- 当客户不方便直接访问一个对象或者不满足需要时,提供一个替身对象来控制这个对象的访问,客户实际上访问的是替身对象
实现方式
场景
- 通过代理上网冲浪
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冲浪
优点
-
代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
-
远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
-
虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
-
保护代理可以控制对真实对象的使用权限。