代理模式详解

代理模式(Proxy Pattern)是一种常用的设计模式,它提供了一个代理对象来控制对另一个对象的访问。以下是代理模式的详细介绍:

  1. 定义

代理模式是一种结构型设计模式,它允许一个代理对象来代表另一个对象(真实对象)执行操作。代理对象可以控制对真实对象的访问,或者在访问真实对象之前和之后执行一些附加操作。

  1. 结构

代理模式通常包含以下三个主要角色:

• Subject(抽象主题):定义了代理对象和真实对象的共同接口,使得代理对象可以像真实对象一样被使用。

• RealSubject(真实主题):实现了抽象主题接口,提供实际的业务逻辑。

• Proxy(代理):实现了抽象主题接口,控制对真实主题的访问,并可以在访问真实主题之前和之后执行一些附加操作。

  1. 类图

classDiagram

class Subject {

<<interface>>

+request()

}

class RealSubject {

+request()

}

class Proxy {

-subject

+request()

}

Subject <|-- RealSubject

Subject <|-- Proxy

Proxy --> RealSubject: contains

  1. 代理模式的类型

代理模式有多种类型,常见的有以下几种:

• 远程代理:用于代理对远程对象的调用,例如在分布式系统中,客户端通过代理对象调用远程服务器上的对象。

• 虚拟代理:用于创建一个资源密集型对象的虚拟代理,例如在图像处理中,先创建一个图像的代理对象,当需要显示图像时,再加载图像数据。

• 保护代理:用于控制对真实对象的访问权限,例如在用户管理中,只有具有特定权限的用户才能访问某些对象。

• 缓存代理:用于缓存对象的状态,避免重复计算或访问数据库,提高系统性能。

• 智能引用代理:用于在对象被引用时执行一些附加操作,例如在对象被删除时执行清理操作。

  1. 优缺点

• 优点:

• 控制访问:代理对象可以控制对真实对象的访问,例如在保护代理中,可以限制只有具有特定权限的用户才能访问某些对象。

• 增强功能:代理对象可以在访问真实对象之前和之后执行一些附加操作,例如在虚拟代理中,可以在加载图像数据之前先检查图像是否存在。

• 延迟初始化:代理对象可以在需要时才创建真实对象,例如在虚拟代理中,可以在图像需要显示时才加载图像数据。

• 缺点:

• 复杂性增加:引入代理对象会增加系统的复杂性,需要更多的代码来实现代理模式。

• 性能开销:代理对象需要在访问真实对象之前和之后执行一些附加操作,可能会增加系统的性能开销。

  1. 实例

假设有一个Image类,表示一个图像对象,加载图像数据需要花费很长时间。我们可以使用代理模式来优化这个过程。

// 抽象主题接口

interface Image {

void display();

}

// 真实主题类

class RealImage implements Image {

private String fileName;

public RealImage(String fileName) {

this.fileName = fileName;

loadFromDisk(fileName);

}

@Override

public void display() {

System.out.println("Displaying " + fileName);

}

private void loadFromDisk(String fileName) {

System.out.println("Loading " + fileName);

}

}

// 代理类

class ProxyImage implements Image {

private RealImage realImage;

private String fileName;

public ProxyImage(String fileName) {

this.fileName = fileName;

}

@Override

public void display() {

if (realImage == null) {

realImage = new RealImage(fileName);

}

realImage.display();

}

}

// 客户端代码

public class Client {

public static void main(String[] args) {

Image image = new ProxyImage("test_10mb.jpg");

// 图像将从磁盘加载

image.display();

// 图像不会重新加载

image.display();

}

}

在这个例子中,ProxyImage类是代理对象,它实现了Image接口。当调用display方法时,如果realImage对象不存在,它会创建一个RealImage对象并加载图像数据。如果realImage对象已经存在,它会直接调用realImage的display方法。这样可以避免在每次调用display方法时都加载图像数据,提高系统的性能。

代理模式是一种非常实用的设计模式,适用于需要控制对对象的访问、增强功能或延迟初始化等场景。

相关推荐
JINGWHALE11 小时前
设计模式 行为型 命令模式(Command Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·命令模式
JINGWHALE19 小时前
设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·策略模式
苹果10 小时前
C++二十三种设计模式之建造者模式
c++·设计模式·建造者模式
重生之绝世牛码11 小时前
Java设计模式 —— 【行为型模式】策略模式(Strategy Pattern) 详解
java·大数据·开发语言·设计模式·策略模式
玉面小君11 小时前
C# 设计模式(行为型模式):解释器模式
设计模式·c#·解释器模式
JINGWHALE111 小时前
设计模式 行为型 观察者模式(Observer Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·观察者模式·设计模式·性能优化·系统架构
渊渟岳11 小时前
掌握设计模式--桥接模式
设计模式
肘击鸣的百k路11 小时前
设计模式和原则
java·前端·设计模式
小小小妮子~14 小时前
设计模式七大设计原则Java 实践
java·设计模式
咖啡の猫21 小时前
原型模式详解与实践
设计模式·原型模式