`

代理模式-proxy

阅读更多

转自:

http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 一、说买电脑的那些事
      我之前一直用的是台式机,可总感觉不方便,特别是携带,就拿租房子后搬家来说吧,费了不少劲。种种原因有了想换笔记本的想法。 5.1假期和一个好朋友特到电脑城去逛了一圈,一进电脑城便见:“HP笔记本XX总代理、IBM笔记本专卖、XX电脑YY总代理......”。

      看了很多家销售店,给我印象最深的就是到处都是XX牌电脑专卖和代理商,就在同一层楼里我就见着同一牌子有6家代理销售商铺。呵呵,看来我们买电脑就直接找销售代理商就可以,没必要在找生产厂商了,厂商生产出电脑后就是要把产品推向市场销售出去,而代理商在此过程中就代替生产商销售产品。这让我想起了面向对象的设计模式--代理(Proxy)模式

二、谈代理(Proxy)模式
  1、代理模式的意图:
     为其他对象提供一种代理以控制对这个对象的访问。
     就以电脑销售代理商来说,他就负责提供一种代理,以控制对电脑制造商销售电脑的方法。
  2、代理模式UML图(下图选自http://www.dofactory.com/

 3、代理模式的动机:
     对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。问题的解决方案
    是使用另一个对象,以电脑销售例子来分析,既电脑销售代理商(ComputerProxy),来替代电脑制造商   (ComputerMaker)。电脑销售代理商可以代替电脑制造商销售电脑,并且在需要的时候(客户在买电脑的时候)负责实
    例化ComputerMaker对象。见下电脑销售代理图:


//电脑代理商销售电脑的方法,当客户在买电脑的时候就调用此方
2//法销售电脑,此时就需要去实例化ComputerMaker对象。
3public void SaleComputer()
4{  
5   if(cm==null)      
6   {     
7      cm = new ComputerMaker();
8   }

9}

  4、代理模式的适用性:
     在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理(Proxy)模式。--选自《设计模式--可复用面
     向对象软件基础》
     比如我们现实生活中的房地产代理、职业介绍所、本文前所提到的电脑销售代理商等。
     西游记里美猴子王孙悟空代高小姐出嫁猪八戒,并制服八戒的故事。

  5、模式的参与者(对比上面电脑销售代理图):
     抽象主题角色(Subject)
     --定义真实主题角色(RealSubject)和主题代理角色(Proxy)的共用接口,这样就在任何使用真实主题角色的地方都可
        以使用主题代理角色。
     就如买电脑,我们可以直接找电脑制造商买电脑,也可以找电脑销售代理商买电脑。

     真实主题角色(RealSubject)
     --定义主题代理角色(Proxy)所代表的实体。

     主题代理角色(Proxy)
     --持有一个真实主题角色的引用,使得代理角色可以直接访问真实主题角色。提供一个与抽象主题角色的接口相同的接
     口方法,这样代理角色就可以用来替代真实主题角色。
     其他的功能依赖于代理的类型,这里就不作过多介绍,详细可查看《设计模式--可复用面向对象软件基础》或其他相
     关资料。
     在电脑的销售体系中,电脑销售代理商完全可以替代电脑制造商销售电脑(如果行不通就不会有那么多的代理商了)。

  6、协作关系:
      --代理根据其种类,在适当的时候向真实主题角色(RealSubject)转发请求。
      买电脑的过程中,我们找的是电脑销售代理商,调用其销售电脑的方法(SaleComputer方法),让他销售一台或多台
      电脑给我们,而他
在这个时候就把请求转发给了电脑制造商(真实主题角色),调用其销售电脑的方法(SaleComputer方
      法)。然而在整个代理中,主题代理角
色持有一个真实主题角色的引用,既:

ComputerMaker cm = null;

    主题代理角色在向真实主题角色转发请求实际也就是通过他所持有的真实主题角色的引用去调用真实主题角色的方法,如
    下:

1if(cm==null
2{    
3  cm = new ComputerMaker();
4}
  
5cm.SaleComputer();

  7、模式效果
      --代理模式在访问对象时引入了一定程度的间接性。
      在我们买电脑的过程中,我们找电脑销售代理商买电脑,调用其销售电脑的方法,而实际是间接的调用了电脑制造商的
      销售电脑方法。

三、电脑销售代理程序

抽象主题角色
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1namespace DesignPattern.Proxy.Computer
 2{
 3    /**//// <summary>
 4    /// 抽象主题角色--声明了真实主题与代理主题的共同接口(共有的特性)。
 5    /// 在任何使用真实主题的地方都可以使用代理主题
 6    /// </summary>

 7    public abstract class Computer
 8    {
 9        /**//// <summary>
10        /// 抽象的主题行为--销售电脑(不管代理商还是制造商,他们的目的就是销售出去产品)
11        /// </summary>

12        public abstract void SaleComputer();
13    }

14}

 

真实的主题角色
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1namespace DesignPattern.Proxy.Computer
 2{
 3    /**//// <summary>
 4    /// 真实的主题角色--定义了代理角色所代表的真实对象(电脑制造商)。
 5    /// </summary>

 6    public class ComputerMaker:Computer
 7    {
 8        /**//// <summary>
 9        /// 制造商可以直接销售电脑
10        /// </summary>

11        public override void SaleComputer()
12        {
13            Console.WriteLine("制造商售出一台电脑!");
14        }

15    }

16}

 

代理主题角色
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1namespace DesignPattern.Proxy.Computer
 2{
 3    /**//// <summary>
 4    /// 代理主题角色--含有对真实主题角色的引用(操作真实主体对象),代理角色通常在将客户端调用传递给真实主题
 5    /// 对象的之前或者之后都会执行某些操作(方法),而不是只单纯的返回真实的对象。
 6    /// 
 7    /// 电脑销售代理商--通过优惠打折扣或送礼品等多种方式吸引客户。
 8    /// 代理角色所代理的真实对象--电脑制造商
 9    /// </summary>

10    public class ComputerProxy:Computer
11    {
12        //持有真实主题角色的引用
13        private ComputerMaker cm = null;
14
15        public override void SaleComputer()
16        {
17            this.Discount();
18            this.GiveMouse();
19            if (cm == null)
20            {
21                cm = new  ComputerMaker();
22            }

23            //通过真实主题角色引用调用销售卖电脑方法(真实主题角色的行为)
24            cm.SaleComputer();
25
26            //此时代理商就完成了电脑的销售,还给了客户优惠和礼品。
27        }

28
29        public void Discount()
30        {
31            Console.WriteLine("我给你8折优惠!");
32        }

33
34        public void GiveMouse()
35        {
36            Console.WriteLine("我还送你一个鼠标!");
37        }

38    }

39}

 

Client
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1namespace DesignPattern.Proxy
 2{
 3    class Program
 4    {
 5        static void Main(string[] args)
 6        {
 7            Computer#region Computer
 8            Console.WriteLine("--制造商销售电脑--");
 9            Computer.Computer sc = new ComputerMaker();
10            sc.SaleComputer();
11
12            Console.WriteLine();
13            Console.WriteLine("--代理商销售电脑--");
14            sc = new ComputerProxy();
15            sc.SaleComputer();
16            #endregion

17        }

18    }

19}

四、代理(Proxy)模式大观园:
     当我们去操作或控制一个对象时,如果该对象处于某种原因不能被调用方直接控制或操作,Proxy模式就该出场了。Proxy模式中的“代理”代表了被代理对象的权利和义务。而这种义务不同于法律文件规定的义务,而是设计者通过一定的设计方式,例如继承或者聚合的方式来获得的。
     虽然我们的设计模式开山老祖GOF在其经典著作《设计模式》一书中阐明,Proxy模式的意图是“为其他对象提供一种代理以控制对这个对象的访问。”描述一目了然,但实际的应用方式,却需要在项目中去体现。
     Proxy模式的应用非常广泛,还包括远程代理,智能代理......等。虽然实现方式不一样,但其中的原理却是相同的,要理解Proxy模式,只要明白“代理”二字的含义就可以一目了然了。----选自《软件设计精要与模式》

五、其他相关模式
     Adapter:适配器(Adapter)模式为它所适配的对象提供一个 不同的接口。相反,代理模式提供了与它的实体相同的接口。然而,用于访问保护的代理可能会拒绝执行实体会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。--选自《设计模式--可复用面向对象软件基础》

六、参考文献
   《设计模式--可复用面向对象软件基础》
   《软件设计精要与模式》
    http://www.dofactory.com/

转载请注明出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

六、参考文献
   《设计模式--可复用面向对象软件基础》
   《软件设计精要与模式》
    http://www.dofactory.com/

转载请注明出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 

 

 

 

 

 

  • 大小: 4.7 KB
  • 大小: 24.4 KB
分享到:
评论

相关推荐

    kubernetes 使用cilium 网络插件 替换kube-proxy

    在Kubernetes环境中,传统的服务发现和网络代理方案是通过kube-proxy来实现的,它提供了iptables、ipvs等不同的工作模式。然而,随着云原生应用的发展,对网络性能、安全性和可观测性的需求日益增强,这催生了Cilium...

    rack-reverse-proxy, rack的反向代理.zip

    反向代理是一种网络架构模式,它位于客户端和服务器之间,接收来自客户端的请求并将其转发给适当的后端服务器。反向代理的主要作用包括负载均衡、安全防护、性能优化等。在Rack的环境中,rack-reverse-proxy扮演的...

    Sharding-Proxy

    Sharding-Proxy 作为数据库的代理层,部署在应用与数据库之间,承担了数据分片、读写分离、分布式事务等核心功能,极大地提升了数据库的处理能力和系统的可扩展性。 **1. 数据分片** 数据分片是 Sharding-Proxy 的...

    apache开源项目源码commons-proxy-1.0-src(全部高质量代理模式proxy的java源程序)

    全部高质量代理模式proxy的java源程序 java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache...

    charles-proxy-4.6.4-win64安装包

    这个“charles-proxy-4.6.4-win64”安装包是专为 Windows 64 位系统设计的最新版本,用于帮助用户捕获、查看并分析网络数据,以便于调试和优化应用程序的网络通信。 **一、Charles 的主要功能** 1. **HTTP/HTTPS ...

    dnscrypt-proxy - 支持加密的DNS协议代理.zip

    这个压缩包文件“dnscrypt-proxy - 支持加密的DNS协议代理.zip”包含了一个名为“dnscrypt-proxy-master”的项目,它是DNSCrypt代理服务的实现,旨在提供加密的DNS查询服务,确保用户的DNS请求在传输过程中不被篡改...

    php-proxy:简单PHP代理脚本

    发出针对此脚本的cURL请求添加具有身份验证密钥的Proxy-Auth标头添加具有代理请求的URL的Proxy-Target-URL标头(可选)为调试模式添加Proxy-Debug标头为了保护未授权用户使用代理,请考虑在和所有请求中更改Proxy-...

    设计模式C++学习之代理模式(Proxy)

    proxy-&gt;request(); delete proxy; return 0; } ``` 在这个例子中,`Subject`是主题接口,`RealSubject`是实现了接口的真实对象,`Proxy`是代理对象,它持有一个`RealSubject`的实例并实现了相同的接口。在`...

    chrome-simply-proxy:Chrome 的简易代理插件

    通过设置 &gt; 扩展程序 &gt; 开发者模式(开启) &gt; 加载已解压的扩展程序,选择 simply-proxy 文件夹进行安装。 下载 crx 文件安装 功能特点 该扩展主要是为了解决前后端分离开发(如 Vue 项目)的过程中,反向代理配置...

    16-Proxy.rar

    代理模式的核心结构包括三部分:真实对象(Real Subject)、代理对象(Proxy)和客户端(Client)。真实对象提供了实际的业务功能,代理对象持有真实对象的引用,并在调用真实对象之前和之后添加额外的操作。客户端...

    dynamic-proxy-demo.zip

    在这个“dynamic-proxy-demo.zip”压缩包中,我们可能找到了关于这两种代理模式的示例代码。 首先,让我们来深入理解动态代理和静态代理的概念。 **静态代理:** 静态代理是最基础的形式,它通过创建目标对象的...

    设计模式专题之(六)代理模式---设计模式代理模式示例代码(python--c++)

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,主要用来为其他对象提供一种代理以控制对这个对象的访问。在这个专题中,我们将深入探讨代理模式,并通过Python和C++两种语言来实现示例代码。 首先...

    c++-设计模式之代理模式(Proxy)

    代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于保护、延迟加载、记录请求等场景,可以在不改变原有对象的情况下为其增加新的功能。 代理...

    node-http-proxy:节点http代理服务器

    节点http代理具有单进程模式或多进程模式(设置参数“ -i”)的节点http代理服务器安装node-http-proxy $npm install -g node-http-proxy服务器启动 $nproxy start -p 9999 -i 1# start proxy server# create child ...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    MySQL 主从配置(linux),mysql-proxy

    安装`mysql-proxy`,例如这里的`mysql-proxy-0.8.5-linux-el6-x86-64bit`,解压后按照官方文档进行配置和启动。 在proxy的配置文件`mysql-proxy.conf`中,我们可以定义服务器池和规则: ```lua proxy-lua-script=/...

    chrome-proxy:chrome的代理扩展

    【chrome-proxy:Chrome的代理扩展】 在互联网世界中,代理服务器是一种重要的网络工具,它能够帮助用户通过不同的IP地址访问网络,从而实现匿名浏览、提高访问速度或绕过某些地域限制。Chrome作为世界上最流行的...

    http-request-proxy

    在这种模式下,您将服务器视为透明代理,它不会修改任何 HTTP 数据(包括标头和正文)。 const express = require ( 'express' ) ; const path = require ( 'path' ) ; const { TIMEOUT_PROXY , } = require ( '....

    java-sington-factory-proxy 开发模式

    在Java中,代理模式可以通过动态代理(Java.lang.reflect.Proxy)或者自定义代理实现。动态代理主要应用于AOP(面向切面编程),如日志记录、事务处理等,而自定义代理则更灵活,可以根据需求定制代理行为。 ```...

    结构型模式之代理模式(Proxy)

    代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...

Global site tag (gtag.js) - Google Analytics