.NET 设计模式—代理模式(Proxy Pattern)

简介

  • 代理模式:为一个对象提供- 一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
  • 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
  • 代理模式有不同的形式,主要有三种静态代理、动态代理(JDK代理、接口代理)和Cglib代理(可以在内存动态的创建对象,而不需要实现接口,他是属于动态代理的范畴)。

角色

  • 抽象主题角色(Subject):声明了真实主题和代理主题的公共接口,这样一来在使用真实主题的任何地方都可以使用代理主题。
  • 代理主题角色(Proxy):代理主题角色内部含有对真实主题的引用,从而可以操作真实主题对象;代理主题角色负责在需要的时候创建真实主题对象;代理角色通常在将客户端调用传递到真实主题之前或之后,都要执行一些其他的操作,而不是单纯地将调用传递给真实主题对象。
  • 真实主题角色(RealSubject):定义了代理角色所代表的真实对象。

优点

  • 代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度;
  • 代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。

缺点

  • 由于在客户端和真实主题之间增加了一个代理对象,所以会造成请求的处理速度变慢
  • 实现代理类也需要额外的工作,从而增加了系统的实现复杂度。

应用场景

  • 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
  • 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
  • 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
  • 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
  • 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。

实现

  • 代理接口
// 代理接口
public interface ISubject
{
    void Request();
}
  • 真实主题
// 真实主题类,实现了ISubject接口
public class RealSubject : ISubject
{
    public void Request()
    {
        Console.WriteLine("真实的请求被处理了。");
    }
}
  • 代理主题
// 代理类
public class Proxy : ISubject
{
    private RealSubject _realSubject;
 
    public void Request()
    {
        if (_realSubject == null)
        {
            _realSubject = new RealSubject();
        }
        // 在调用真实主题之前可以进行一些处理
        Console.WriteLine("代理处理请求前的操作。");
        _realSubject.Request(); // 调用真实主题的方法
        // 在调用真实主题之后可以进行一些处理
        Console.WriteLine("代理处理请求后的操作。");
    }
}
  • 上层调用
// 客户端代码
public class Client
{
    public static void Main()
    {
        ISubject proxy = new Proxy();
        proxy.Request();
    }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉量*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值