C#设计模式详解:代理模式实现与分类解析

栗子
栗子
发布时间:2026-10-14| 3人浏览过
原创

代理模式是结构型设计模式中的重要成员,主要解决在无法直接访问某个对象或访问存在困难时,通过一个代理对象来间接访问的问题。为保证客户端使用的透明性,真实对象与代理对象需实现相同的接口。本文通过C#代码示例详解其实现方式,并分类介绍远程代理、虚拟代理、安全代理及智能指引等典型应用场景。

代理模式的核心原理

代理模式的核心在于创建一个代理对象,该对象包含对真实对象的引用,并实现与真实对象相同的接口。当客户端调用代理对象的方法时,代理对象可以将请求转发给真实对象,从而实现对真实对象的控制或增强。

以下是使用 C# 实现的代理模式基本结构示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignModel
{
    // 定义操作接口
    public interface IAction
    {
        void SendFlower();
        void SendCake();
    }

    // 真实主题类
    public class ZQZ : IAction
    {
        public string myname { set; get; }

        public void SendFlower()
        {
            Console.WriteLine(myname + "送花");
        }

        public void SendCake()
        {
            Console.WriteLine(myname + "送蛋糕");
        }
    }

    // 代理类
    public class Proxy : IAction
    {
        private ZQZ zzz = null;

        public Proxy(ZQZ mm)
        {
            zzz = mm;
        }

        public void SendFlower()
        {
            // 可以在这里添加前置逻辑,如权限检查
            if (zzz != null)
                zzz.SendFlower();
        }

        public void SendCake()
        {
            // 可以在这里添加后置逻辑,如日志记录
            if (zzz != null)
                zzz.SendCake();
        }
    }
}

在上述代码中,IAction 接口定义了公共行为,ZQZ 是实现了该接口的真实主题类,而 Proxy 类则作为代理类,持有 ZQZ 的实例并实现了 IAction 接口。客户端可以通过代理对象发起请求,从而实现了对真实对象的间接访问。

客户端调用示例

在实际使用中,客户端并不关心自己操作的是真实对象还是代理对象,这正是代理模式“透明性”的体现。以下是一个简单的调用示例:

ZQZ zzz = new ZQZ();
zzz.myname = "朱建军";
Proxy p = new Proxy(zzz);
p.SendFlower();
p.SendCake();

通过上述调用,程序将输出:
朱建军送花
朱建军送蛋糕

代理模式的常见分类与应用场景

根据使用目的的不同,代理模式可以分为多种类型,每种类型都有其特定的应用场景。

第1步:远程代理(Remote Proxy)

目的:为一个位于不同地址空间的对象提供一个本地代表,以隐藏对象存在于不同地址空间的事实。

应用:例如在 WebService 服务调用中,客户端通过远程代理对象与方法进行交互,而无需关心具体的网络通信细节。远程代理负责处理网络序列化、反序列化以及数据传输。

第2步:虚拟代理(Virtual Proxy)

目的:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真正对象。

应用:最典型的例子是浏览器中图片的懒加载。在页面滚动到可视区域之前,浏览器只放置一个占位符(虚拟代理),当用户视线到达时,再加载真实的图片资源。这优化了初始页面的加载速度。

第3步:安全代理(Protection Proxy)

目的:用来控制对真实对象访问时的权限。

应用:在系统内部,某些敏感操作可能需要管理员权限。通过安全代理,可以在调用真实对象方法前进行身份验证和权限检查,确保只有具备相应权限的用户才能执行特定操作。

第4步:智能指引(Smart Reference)

目的:指调用真实对象时,代理处理另外一些事情,如记录访问次数、缓存结果等。

应用:例如,当一个对象被频繁访问时,可以创建一个智能代理来缓存其结果,避免重复计算或重复访问昂贵资源。此外,还可以用于跟踪对象的引用计数,以便在不再需要时自动释放资源。

总结

代理模式作为一种经典的结构型设计模式,不仅解决了对象访问受限的问题,还通过不同的代理类型实现了权限控制、性能优化、延迟加载等功能。在 C# 开发中,合理利用代理模式可以使代码结构更加清晰,解耦客户端与真实对象之间的依赖关系。

以上就是C#代理模式实现与应用场景的详细内容,更多关于C#设计模式优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。