0
点赞
收藏
分享

微信扫一扫

【蓝桥·算法双周赛 第 2 场 小白入门赛】蓝桥小课堂-平方和【算法赛】题解(数学+四则运算)

简介

  • 代理模式:为一个对象提供- 一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
  • 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
  • 代理模式有不同的形式,主要有三种静态代理、动态代理(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();
    }
}
举报

相关推荐

0 条评论