zoukankan      html  css  js  c++  java
  • 面向对象编程思想-代理模式

    一、引言

    在系统开发过程中,大多会遇到跨网络做系统应用间数据对接问题,但目标对象不允许跨网络直接访问数据,通常考虑到网络和安全性能等因素,开发者会在客户端和目标对象间添加一层中间层--代理层,也是即将要介绍的代理模式(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.实现代理类需要额外的工作,从而增加了系统实现复杂度

    分析:

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

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

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

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

  • 相关阅读:
    day9习题
    生产者消费者模型(吃包子例子)
    map 函数----filter函数
    #返回值包含函数
    #把函数当作参数传给另一个函数
    异常和错误!
    递归调用
    局部和全局案例!!
    全局变量与局部变量2
    全局变量与局部变量
  • 原文地址:https://www.cnblogs.com/jdzhang/p/7340919.html
Copyright © 2011-2022 走看看