面向对象编程思想-代理模式

一、引言

在系统开发过程中,大多会遇到跨网络做系统应用间数据对接问题,但目标对象不允许跨网络直接访问数据,通常考虑到网络和安全性能等因素,开发者会在客户端和目标对象间添加一层中间层--代理层,也是即将要介绍的代理模式(Proxy)。

二、代理模式介绍

在介绍代理模式前,我们首先看一下代理模式的分类

1.远程(Remote)代理:为一个位于不同地址空间的对象提供局部代表对象,隐藏一个对象存在于不同地址空间的事实。

典型例子:webservice在.NET中的应用,在应用程序项目中加入web引用,引用一个webservice,会生成WebReference文件夹和一些文件,其实它们就是代理,使得客户端程序调用代理就可以解决远程访问的问题。

2.虚拟(Virtual)代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,使得此对象只在需要时才被真正创建。

典型例子:图片延迟加载(ImageLazyLoad),当打开一个很大的HTML网页时,可以看到所有文字,但是图片是一张一张下载后才能看到。未打开的图片框,就是通过虚拟代理替代了真实图片,此时代理存放了真实图片的尺寸和路径。好处是 代理对象可以在必要的时候才将被代理对象加载,加载可以在加载过程加以必要的优化

3.安全(Protection)代理:控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候

4.智能引用(Smart Reference)代理:指当调用真实的对象时,代理处理另外一些事。比如将真实对象的引用次数记录下来

5.Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有客户端真正需要时才执行。一般对象的深克隆是一个开销很大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到时才被克隆

定义:为其他对象提供一种代理以控制对这个对象的访问

三、代理模式实现

介绍完代理模式的定义,下面用以生活中的例子解释一下代理模式,海外代购,这个场景中代购(ProxyBuyPerson)就是我们(RealBuyPerson)的一个代理,统一公共接口买产品(BuyProduct)

    //抽象主题角色
    public abstract class Person
    {
        public abstract void BuyProduct();
    }
    //真实主题角色
    class RealBuyPerson : Person
    {
        public override void BuyProduct()
        {
            Console.WriteLine($"买一个Iphone和一台苹果电脑");
        }
    }
    //代理角色
    class ProxyBuyPerson : Person
    {
        //引用真实主题实例
        RealBuyPerson realPerson;
        public override void BuyProduct()
        {
            if(realPerson==null)
            {
                realPerson = new RealBuyPerson();
            }
            this.BeforeBuyProduct();
            realPerson.BuyProduct();
            this.AfterBuyProduct();
        }
        private void BeforeBuyProduct()
        {
            Console.WriteLine($"列个清单,确认要买的东西");
        }
        private void AfterBuyProduct()
        {
            Console.WriteLine($"核对清单,确定没有买错");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //创建一个代理对象
            Person proxy = new ProxyBuyPerson();
            proxy.BuyProduct();
            Console.Read();
        }
    }
View Code

优点:

1.代理模式能够将调用与真正被调用的对象隔离,在一定程度上降低了系统耦合度

2.代理对象在客户端和目标对象之间起到一个中介作用,可以对目标对象起到一个保护作用。可以在对目标对象发出请求前做一个额外操作,如权限检查

缺点:

1.由于在客户端和真实主题之间增加了代理对象,因此有些代理模式可能会造成请求的处理速度变慢

2.实现代理类需要额外的工作,从而增加了系统实现复杂度

分析:

代理模式与适配器模式:适配器为它所适配的对象提供一个不同的接口;代理提供了与它的实体相同的接口

代理模式与装饰模式:代理模式在上层接口中定义了主要功能,而代理提供功能控制对象的访问权限;装饰模式在上层接口中定义了部分功能,通过装饰链动态给对象增加职能

本文关于代理模式的学习就到这里结束了,设计模式之结构型设计模式(关注对象的组合)的学习也告一段落。

文中如有不足,欢迎斧正,感谢您的阅读。

原文地址:https://www.cnblogs.com/jdzhang/p/7340919.html