代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式可以用于延迟加载、控制访问、日志记录、缓存等。
代理模式的主要角色
-
Subject(抽象主题):
- 定义了代理类和真实类的公共接口。
-
RealSubject(真实主题):
- 实现了Subject接口,是真正需要被代理的对象。
-
Proxy(代理类):
- 持有对RealSubject的引用,并通过实现Subject接口来控制对RealSubject的访问。
代理模式的类型
- 远程代理:为一个对象在不同地址空间提供局部代表。
- 虚拟代理:根据需要创建开销很大的对象。
- 保护代理:控制对原始对象的访问。
- 智能引用代理:在访问对象时执行一些附加操作。
示例代码
以下是一个简单的虚拟代理示例,展示如何延迟加载资源密集型对象:
// 抽象主题 public interface IImage { void Display(); } // 真实主题 public class RealImage : IImage { private string _fileName; public RealImage(string fileName) { _fileName = fileName; LoadFromDisk(); } private void LoadFromDisk() { Console.WriteLine($"Loading {_fileName}"); } public void Display() { Console.WriteLine($"Displaying {_fileName}"); } } // 代理类 public class ProxyImage : IImage { private RealImage _realImage; private string _fileName; public ProxyImage(string fileName) { _fileName = fileName; } public void Display() { if (_realImage == null) { _realImage = new RealImage(_fileName); } _realImage.Display(); } } // 客户端代码 class Program { static void Main() { IImage image = new ProxyImage("test.jpg"); // 图像将从磁盘加载 image.Display(); // 图像不需要从磁盘加载 image.Display(); } }
代理模式的优点
- 控制对象访问:可以在不修改客户端代码的情况下控制对真实对象的访问。
- 性能优化:通过延迟加载来提高性能。
- 附加功能:可以在访问对象时添加额外的功能,如日志记录和权限控制。
代理模式的缺点
- 增加复杂性:引入额外的类和接口,可能增加系统的复杂性。
- 延迟响应:由于增加了一层间接访问,可能会导致响应时间增加。