在C#中,代理模式(Proxy Pattern)是一种结构型设计模式,它为一个对象提供一个代理或占位符,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,并且可以通过代理对象来间接访问目标对象。
代理模式通常用于以下场景:
- 远程代理(Remote Proxy):为一个位于不同地址空间的对象提供一个本地的代理对象,以便远程访问。
- 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象的引用。
- 保护代理(Protect or Access Proxy):用于控制对原始对象的访问。
- 智能指引(Smart Reference Proxy):取代了简单的指针,它在访问对象时执行一些附加操作,如懒加载、缓存、同步、日志记录、事务等。
以下是一个简单的C#代理模式示例,展示了一个虚拟代理的用法,其中代理对象用于延迟加载大型资源(如图片)的实例化:
using System;
// 真实对象接口
public interface IImage
{
void Display();
}
// 真实对象
public class RealImage : IImage
{
private string filename;
public RealImage(string filename)
{
this.filename = filename;
LoadFromDisk(filename);
}
private void LoadFromDisk(string filename)
{
// 这里模拟加载图片的过程,实际开发中可能是从文件或数据库加载
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)
{
this.filename = filename;
}
public void Display()
{
if (realImage == null)
{
realImage = new RealImage(filename);
}
realImage.Display();
}
}
// 客户端代码
class Program
{
static void Main(string[] args)
{
IImage image = new ProxyImage("test.jpg");
// 假设这里进行了一些操作,然后需要显示图片
image.Display(); // 第一次调用Display()时,RealImage会被实例化
// 再次显示图片,此时不会重新加载
image.Display();
}
}
在这个例子中,`ProxyImage` 类是 `RealImage` 的代理。它控制了对 `RealImage` 对象的访问,并在第一次调用 `Display` 方法时创建 `RealImage` 对象。这有助于延迟加载大型资源,从而优化应用程序的性能。