第12章 代理模式(Proxy Pattern)

简介: 原文   第12章 代理模式(Proxy Pattern) 代理模式   概述:   在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。

原文   第12章 代理模式(Proxy Pattern)

代理模式

 

概述:

 

在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。这就是本文要说的Proxy模式。

 

结构图:

 

 

举例:

 

    代练游戏,玩游戏,自己不想花时间去升级。委托给代练。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
     //游戏
     class  Dota
     {
         public  void  Play()
         {
             Console.WriteLine( "玩dota" );
         }
     }
 
     //代理类
     class  Proxy
     {
         public  Dota game =  new  Dota();
         //代理 帮你玩(代练)
         public  void  Play()
         {
             game.Play();
             //收费
             Money();
         }
         //扩展
         public  void  Money()
         {
             //代练要收费的
         }
     }
     //客户端调用
     class  Program
     {
         static  void  Main( string [] args)
         {
             Proxy p =  new  Proxy();
             p.Play();
             Console.ReadLine();
         }
     }

 

一般在实际的过程中代理类跟被代理类都会使用同一个接口,只是我们不能修改被代理着

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  interface  IGame
     {
         void  Play();
     }
     //游戏
     class  Dota : IGame
     {
         public  void  Play()
         {
             Console.WriteLine( "玩dota" );
         }
     }
 
     //代理类
     class  Proxy : IGame
     {
         public  Dota game =  new  Dota();
         //代理 帮你玩(代练)
         public  void  Play()
         {
             game.Play();
             //收费
             Money();
         }
         //扩展
         public  void  Money()
         {
             //代练要收费的
         }
     }
     //调用
     class  Program
     {
         static  void  Main( string [] args)
         {
             IGame p =  new  Proxy();
             p.Play();
             Console.ReadLine();
         }
     }

 

 

   上面是一个非常简单的代理模式,就是加了一个中间层,并且我们可以对中间层进行扩展。当然在实际的应用中可能没这么简单,可能涉及到接口,继承等。这里就不在添加旁支的东西,只讲核心,希望以最简单的代码把事情描述清楚,以防误导大家!

 

扩展   

 

Proxy模式根据种类不同,效果也不尽相同:

    1.远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。

    2.虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。

    3Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

    4.保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

    5Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

    6.防火墙(Firewall)代理:保护目标,不让恶意用户接近。

    7.同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

    8.智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

 

代理模式与适配器模式及外观模式的区别

 

 

代理模式(Proxy):

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

适配器模式(Adapter):

    将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一起工作的那些类可以一起工作。

外观模式(Facade):

    为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

 

     代理模式和适配器模式应该说很相像,但是他们的区别也很明显,代理模式和被代理者的接口是同一个,只是使用中客户访问不到被代理者,所以利用代理间接的访问,而适配器模式,是因为接口不同,为了让用户使用到统一的接口,把原先的对象通过适配器让用户统一的使用,大多数运用在代码维护的后期,或者借用第三方库的情况下 ,而外观模式,是大家经常无意中使用的,就是把错综复杂的子系统关系封装起来,然后提供一个简单的接口给客户使用,就类似于一个转接口,可以想象成一个漏斗,中间细的那一段,越细耦合度越低,外观模式就是为了降低耦合度。

目录
相关文章
|
JavaScript
推荐一款工具 -- Watt Toolkit
你是否在为访问Github速度慢而发愁?来来来,推荐你一款工具试试 「Watt Toolkit」是一个开源跨平台的多功能游戏工具箱。 网络加速 使用 YARP.ReverseProxy 开源项目进行本地反代来支持更快的访问游戏网站。 脚本配置 通过加速服务拦截网络请求将一些 JS 脚本注入在网页中,提供类似网页插件的功能。 账号切换 一键切换已在当前 PC 上登录过的 Steam 账号,与管理家庭共享库排序及禁用等功能。
5052 0
推荐一款工具 -- Watt Toolkit
|
XML SQL 存储
2022渗透测试面试大全(过来人的全部家底)
2022渗透测试面试大全(过来人的全部家底)
2022渗透测试面试大全(过来人的全部家底)
|
存储 缓存 安全
阿里云4核CPU云服务器多少钱?4核CPU阿里云服务器可选实例及价格参考
阿里云4核CPU云服务器多少钱?CPU核心数的大小代表了云服务器的运算能力,CPU越高,云服务器的性能越好,我们常用的云服务器一般是2核、4核、8核这几个类型,当然企业用户可能会选择更高的配置,对于个人站长上面几个核心数的CPU云服务器已够用。我们在实际购买中会发现,相同cpu核数的云服务器,还有不同的云服务器实例可选,价格差别也比较大,今天小编整理一份阿里云服务器4核CPU活动价格表,供大家参考:
575 0
阿里云4核CPU云服务器多少钱?4核CPU阿里云服务器可选实例及价格参考
|
存储 JSON 安全
云服务器CentOS8.2安装部署Docker一文详解
云服务器CentOS8.2安装部署Docker一文详解
1156 0
云服务器CentOS8.2安装部署Docker一文详解
|
Java Linux Maven
|
消息中间件 存储 NoSQL
延迟消息的五种实现方案
生产者把消息发送到消息队列中以后,并不期望被立即消费,而是等待指定时间后才可以被消费者消费,这类消息通常被称为延迟消息。延迟消息的应用场景其实是非常的广泛,比如以下的场景:
891 0
延迟消息的五种实现方案
|
安全 开发者
新能力|分账明白,账本清楚,商家超轻松
目前,商家分账 功能已经全面开放给企业商户,快来了解一下吧。
2826 12
新能力|分账明白,账本清楚,商家超轻松
|
新零售 Dubbo Java
小米电商 Apache Dubbo-go 微服务实践
2021 年是小米中国区电商部门变动调整较大的一年,小米中国区早期电商、服务体系建立在 Go 语言构建的微服务体系之上,由内部自研的 Go 语言微服务框架 koala 支撑起数以千计的微服务应用。随着业务的发展,新零售体系的成立以及业务中台普及与推广,我们更倾向于拥有丰富生态的 Java 为主的微服务体系技术选型,新项目及服务大多基于 Apache Dubbo、Spring Cloud 的微服务生态。
764 0
小米电商 Apache Dubbo-go 微服务实践
|
Unix Linux C++
GLS基本介绍
开坑了,这里从介绍GLS基本信息开始,至于怎么安装GLS,请看这里:https://dreamlife.blog.csdn.net/article/details/105763499。
985 0
GLS基本介绍
|
Windows
eNSP检测不到网卡信息——WinPacp
eNSP检测不到网卡信息——WinPacp
1283 0
eNSP检测不到网卡信息——WinPacp