当前位置:   article > 正文

C# 代理模式

C# 代理模式

栏目总目录


概念

代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中,我们创建一个具有现有对象(称为“真实对象”或“被代理对象”)相同功能的代理对象。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象间接地访问目标对象。这种方式可以增加额外的功能处理,例如权限校验、日志记录、事务处理等。

角色

在代理模式中,通常包含以下几个角色:

  1. Subject(抽象主题角色):定义了真实对象和代理对象的共同接口,这样在任何使用真实对象的地方都可以使用代理对象。
  2. RealSubject(真实主题角色):定义了代理所代表的真实对象,它实现了Subject接口,是代理对象所代表的真实实体。
  3. Proxy(代理角色):持有对真实对象的引用,从而可以在任何时候操作真实对象。代理对象在客户端和目标对象之间起到中介的作用,并且可以通过代理对象间接地访问目标对象。

好处

  1. 功能增强:可以在不修改原有系统代码的情况下,通过代理类增加新的功能。
  2. 权限控制:通过代理类控制对真实对象的访问权限,实现不同用户访问同一对象的不同权限。
  3. 日志记录:通过代理类可以对真实对象的方法调用进行日志记录,方便问题追踪和系统监控。
  4. 远程代理:可以将网络上的远程对象作为本地对象来访问,隐藏了远程调用的细节。

应用场景

  1. 远程代理:为远程对象提供一个本地的代理对象,隐藏远程调用的复杂性。
  2. 虚拟代理:根据需要动态地创建开销大的对象,如图片加载、视频流等。
  3. 保护代理:控制对原始对象的访问,防止非授权访问。
  4. 智能引用代理:当对象被访问时,增加一些额外的操作,如计数、懒加载等。

示例代码

以下是一个简单的 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}");
        // 这里模拟加载图片的过程,实际开发中可能是复杂的文件读取和网络请求
        System.Threading.Thread.Sleep(1000); // 模拟耗时操作
        Console.WriteLine($"{filename} loaded");
    }

    public void Display()
    {
        Console.WriteLine($"Displaying {filename}");
    }
}

// 代理角色
public class ProxyImage : IImage
{
    private RealImage realImage;
    private string filename;
    private bool isLoaded = false;

    public ProxyImage(string filename)
    {
        this.filename = filename;
    }

    public void Display()
    {
        if (!isLoaded)
        {
            realImage = new RealImage(filename);
            isLoaded = true;
        }
        realImage.Display();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        IImage image = new ProxyImage("test.jpg");

        // 假设在此时,我们不需要立即加载图片,只是占个位置

        // 稍后,当真正需要显示图片时
        image.Display(); // 此时才会真正加载图片

        Console.ReadLine();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

总结

代理模式是一种非常有用的设计模式,它通过引入代理对象来控制对真实对象的访问,从而实现功能增强、权限控制、日志记录等目的。在C#中,代理模式可以应用于多种场景,如远程调用、虚拟代理、保护代理等,提高了软件系统的灵活性和可扩展性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/882966
推荐阅读
相关标签
  

闽ICP备14008679号