c# 代理模式


在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` 对象。这有助于延迟加载大型资源,从而优化应用程序的性能。