代理模式(Proxy Pattern)是一种结构型设计模式,其目的是通过创建一个代理对象,控制对其他对象的访问。代理模式可以在访问对象时引入一些额外的逻辑,例如权限验证、延迟加载、缓存等。

代理模式包含以下主要角色:

1. 抽象主题(Subject): 定义了代理对象和真实对象的共同接口,客户端通过抽象主题访问真实对象。

2. 真实主题(RealSubject): 定义了实际的业务逻辑,是代理模式中被代理的对象。

3. 代理(Proxy): 实现了抽象主题接口,并持有对真实主题的引用。在代理对象中可以添加一些额外的逻辑,然后调用真实主题的方法。

4. 客户端(Client): 使用代理对象来访问真实对象的客户端代码。

下面是一个简单的代理模式的例子,假设我们有一个图片显示的接口,其中包含了加载和显示图片的方法,我们希望通过代理来控制对图片的访问:
# 抽象主题
class ImageSubject:
    def display(self):
        pass

# 真实主题
class RealImage(ImageSubject):
    def __init__(self, filename):
        self._filename = filename
        self._load_image()

    def _load_image(self):
        print(f"Loading image: {self._filename}")

    def display(self):
        print(f"Displaying image: {self._filename}")

# 代理
class ImageProxy(ImageSubject):
    def __init__(self, filename):
        self._filename = filename
        self._real_image = None

    def display(self):
        if self._real_image is None:
            self._real_image = RealImage(self._filename)
        self._real_image.display()

# 客户端代码
if __name__ == "__main__":
    # 创建代理对象
    image_proxy = ImageProxy("example.jpg")

    # 调用代理对象的方法
    image_proxy.display()

    # 注意:真实对象的加载在第一次调用 display 方法时进行

在上述示例中,ImageSubject 是抽象主题,定义了显示图片的接口。RealImage 是真实主题,实现了具体的加载和显示图片的逻辑。ImageProxy 是代理,持有对真实主题的引用,在调用 display 方法时会延迟加载真实主题,只有在需要显示图片时才会真正加载。

代理模式的优点在于它可以在访问对象时引入一些额外的逻辑,例如延迟加载、权限验证等。这样可以提高系统的灵活性和安全性。代理模式的一种常见应用是虚代理(Virtual Proxy)和保护代理(Protection Proxy)。虚代理用于延迟加载,而保护代理用于控制对对象的访问权限。


转载请注明出处:http://www.zyzy.cn/article/detail/11850/设计模式