`

Gmail使用与代理模式

阅读更多

通过使用Gmail,进一步理解软件设计模式中的代理模式(Proxy pattern).

 

Gmail邮箱的使用需求:

一直使用的邮箱A,所有的邮件进出的直接使用邮箱;

大量的团队邮箱C1,C2,C3,...,Cn;

以前被废弃的邮箱D1,D2,D3,...,Dm。
为了使用的方便,我们希望所有的团队邮箱中的邮件能够自动转发到A,被废弃的邮箱能够自动转发邮件到A。一般情况下,我们可以简单的通过让C系、D系邮箱自动转发到A,不支持转发的可以通过Gmail自带的邮件提取功能去主动提取邮件。


我们似乎看到了解决的方法,但是对于有“洁癖”的朋友可能发现这样的问题:

邮件e同时发送到A,C1,D1,则出现了A中出现了三封一样的邮件e,这样不论是视觉上还是空间上面都是一种浪费。能否将其过滤掉呢?在这个时候大家可能容易想到那些强大的邮件过滤器机制。但是经过尝试,你会发现随着n、m值的增多,我们可能需要在A中设置大量的复杂的过滤机制,这样我们就增加了日常邮件系统的维护。这让我们很容易想到请别的人帮我们做过滤,在公司中你可能会有机会被配一个秘书来做此事,但是更多的人可能就得自我来“人肉法”了。那么我们能否请一个自动秘书呢?通过这个思路,我们在直接给A转发各种邮件时,先通过一个秘书,让秘书做统一的过滤后做再次转发至A.


以上就是通过一个统一的过滤秘书B,来达到简洁处理的效果。以后再有C系、D系邮箱的增加,我们就直接让他们转发到秘书B那里就好了。

如此以来,我们简化了A的过滤规则,提高了以后扩展邮箱时的速度。在这里我只是抛砖引玉,其实B中的过滤转发条件是丰富多样了,大家可以根据自己的具体需要来定制。

现在我们将解决方案引申,可以得到一种称为“代理”的广义社会生活的解决方案。

 

什么是代理?

维基百科 写道
代理 (Agency),在法律学中系指代理人于代理权限内,以本人名义向第三人代为或代受意思表示,而对本人直接发生效力的行为。而代理依其发生的原因又可以分为法定代理与意定代理。
代理基本上为财产法上概念,具一身专属性质的身分行为原则上不许代理;另外,侵权行为也不能代理。
 
雅虎知识堂 写道
代理是指一方(代理人)以他方(被代理人)的名义,在授权范围内与第三人从事的贸易活动,而其权利和义务的后果又直接归属于他方的行为。依产生的根据不同,可分为委托代理、法定代理和指定代理。
1.委托代理,是基于被代理人的委托而发生的代理关系;
2.法定代理,是根据法律的直接规定而发生的代理关系;
3.指定代理,是根据人民法院和有关单位的指定而发生的代理关系。

  代理人在代理权限内,以被代理人的名义进行民事活动,其法律后果直接由被代理人承受的法律制度。代理是三方人之间的民事法律关系,即代理人与被代理人之间的关系,代理人与第三人之间的关系,第三人与被代理人之间的关系。

  代理的适用范围包括:
  1.代理实施法律行为,如代理进行买卖、租赁、签订合同和履行债务等;
  2.代理进行民事诉讼;
  3.代理履行某些财政、行政义务,如代理进行房屋登记、法人登记、商标注册。纳税等。但某些具有人身性质的民事行为如婚姻登记、收养子女、立遗嘱等,以及某些具有人身性质的债务如约稿合同、演出合同等,依法须由本人亲自履行的,不能代理。此外,侵权行为和内容违法的行为,也不能进行代理。

 在我理解,代理就是代替我们处理一些事务。

 

现在我们来看看设计模式中的经典设计模式之一“代理模式”。

我第一次看到代理模式,是在《Head First 设计模式》中看到的,里面的引入例子就是我们在Java中通常使用的RMI.其实我感觉这个例子不够生动,至少我使用这个东西的机会很少;后来我又在使用Spring时看到了大量使用代理模式的样例和具体使用场景,这里面的例子则及其生动的展现了一个代理的所作所为(从XML绑定,到后面的使用都体现了这个优秀的设计模式的优越性)。

深入浅出基于Java的代理设计模式 写道
http://tech.sina.com.cn/s/s/2005-03-09/0930545280.shtml


......................................................
二、定义和分类
  代理模式在设计模式中的定义就是:为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。
  那么什么时候要使用代理模式呢?在对已有的方法进行使用的时候出现需要对原有方法进行改进或者修改,这时候有两种改进选择:修改原有方法来适应现在的使用方式,或者使用一个“第三者”方法来调用原有的方法并且对方法产生的结果进行一定的控制。第一种方法是明显违背了“对扩展开放、对修改关闭”(开闭原则),而且在原来方法中作修改可能使得原来类的功能变得模糊和多元化(就像现在企业多元化一样),而使用第二种方式可以将功能划分的更加清晰,有助于后面的维护。所以在一定程度上第二种方式是一个比较好的选择!
  当然,话又说回来了,如果是一个很小的系统,功能也不是很繁杂,那么使用代理模式可能就显得臃肿,不如第一种方式来的快捷。这就像一个三口之家,家务活全由家庭主妇或者一个保姆来完成是比较合理的,根本不需要雇上好几个保姆层层代理:)
  根据《Java与模式》书中对代理模式的分类,代理模式分为8种,这里将几种常见的、重要的列举如下:
  1. 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。
  2. 虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象延迟的真正需要时才创建。比如:如果一个很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,这个大图片可能就影响了文档的阅读,这时需要做个图片Proxy来代替真正的图片。
  3. 保护(Protect or Access)代理:控制对一个对象的访问权限。比如:在论坛中,不同的身份登陆,拥有的权限是不同的,使用代理模式可以控制权限(当然,使用别的方式也可以实现)。
  4. 智能引用(Smart Reference)代理:提供比对目标对象额外的服务。比如:纪录访问的流量(这是个再简单不过的例子),提供一些友情提示等等。
  代理模式是一种比较有用的模式,从几个类的“小结构”到庞大系统的“大结构”都可以看到它的影子。

  三、结构
  代理模式中的“代理商”要想实现代理任务,就必须和被代理的“厂商”使用共同的接口(你可以想象为产品)。所以自然而然你会想到在java中使用一个抽象类或者接口(推荐)来实现这个共同的接口。于是代理模式就有三个角色组成了:
  1.抽象主题角色:声明了真实主题和代理主题的共同接口。
  2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
  3.真实主题角色:定义真实的对象。
  使用类图来表示下三者间的关系如下:

 
  当然,图上所示的是代理模式中的一个具体情况。而代理模式可以非常灵活的使用其他方式来实现,这样就与图上所示有很大的区别。
  也许,现在你已经对代理模式已经有了一个宏观的认识了,下面我们来看看怎么实际的使用代理模

.........................

 网上有很多讨论这个设计模式的文章,我的开发经验有限在这里就不献丑了。

 

总结:

  • 设计模式不仅仅可以使用在软件设计中,更可以发挥我们的想像将它们使用到一切适用的地方。本身这一个个模式都来源于生活嘛。
  • 充分利用网上的各个工具,力争使我们的工作生活娱乐“低耦合”、“高内聚”、“易扩展”。
  • 大小: 16.4 KB
  • 大小: 21.3 KB
  • 大小: 11.3 KB
分享到:
评论
4 楼 Anddy 2009-03-10  
王部 ~~~原来你在这里--javaeye !!向你学习
3 楼 qianjigui 2009-02-14  
<div class="quote_title">wdlfellow 写道</div>
<div class="quote_div">cglib和jdk dynamic proxy采用就是这种代理方式吧?</div>
<p>这两款工具,我确实没有怎么使用过。不过从其典型实例来看,</p>
<p>jdk dynamic proxy 一种典型的动态代理模式,感觉很像spring的底层实现哦。里面大量使用反射机制,确实是一个好的选择。在刚刚开始的时候,很多程序员都人为利用java的reflect的机制效率低速度慢,不过从后面的实践发现正是利用了这种机制使软件开发速度加快,“宁花机器一分,不花程序员一秒”嘛。</p>
<p> </p>
<p>cglib确实非常典型哦。</p>
2 楼 wdlfellow 2009-02-14  
cglib和jdk dynamic proxy采用就是这种代理方式吧?
1 楼 wdlfellow 2009-02-14  
恩~学习了,楼主旁征博引,肚子很多墨水哦。

相关推荐

    proxy-switcher:一个Gnome Shell Extension来切换代理模式

    Gnome Shell扩展,用于在预定义模式“无”,“手动”和“自动”之间切换代理模式。 该扩展程序在网络部分正下方的聚合菜单栏(即主菜单栏)中添加了一个菜单,如下所示: gnome扩展页面在。 使用安装,或者按照下面...

    nc115.rar by chenghao0511#gmail.com

    标题中的"nc115.rar by chenghao0511#gmail.com"提示我们这是一个与Netcat相关的资源,由chenghao0511@gmail.com分享的。Netcat,通常简称为nc,是一个开源工具,用于创建网络连接,进行端口扫描、数据传输、反向...

    支持全文检索的邮件代理服务平台 ——用户注册管理及JavaMail的应用与实现.doc

    国内外已有许多邮件管理软件和服务,如Outlook、Gmail等,但它们往往缺乏对多邮箱的统一管理和全文检索功能。因此,开发一个支持全文检索的邮件代理服务平台,不仅满足了用户需求,也体现了技术的创新性。 1.3 本文...

    Android代码-MultiTypeRecyclerViewAdapter

    一个专注于RecyclerView优雅刷新(接管资源和数据源来代理进行数据处理)、高灵活、低耦合、健壮性以及高效性的轻量级MVP模式库,支持大多数Adapter 架构 特点 使用简单快捷,支持大多数Adapter(高灵活、低耦合) 一...

    网络限速工具(SKiller)

    过任意ARP防火墙,流量探测为抽样探测模式,流量探测时强度可调高些。 注意:本版本无需安装winpcap ,需安装.net framework 2.0,不支持无线网卡。 bugs mailto:cncert.net@gmail.com 更新版本请手动检查 ...

    Android操作系统WCDMA手机3G上网设置教程[整理].pdf

    其独特的特性,如与Gmail邮箱账户的绑定以及丰富的Market应用商店,都为用户带来了便捷的使用体验。 Android系统的一大亮点在于它的多任务处理能力,用户可以同时运行多个应用程序,而且切换流畅,这与WM操作系统...

    Lecture 07.pptx

    在张自震(zhangzizhen@gmail.com)教授的中山大学数据与计算机科学学院的课程讲义中,深入探讨了这个主题。这堂课的重点是机器学习的基本概念、与其他学科的关系以及一些关键术语。 首先,AI 是研究能在环境中感知...

    基于SpringBoot整合RabbitMQ发送邮件通知

    RabbitMQ 则是一种消息代理和队列服务器,基于 AMQP(Advanced Message Queuing Protocol)协议,用于在分布式系统中存储和转发消息。它提供高可用性、可靠性和可扩展性,常用于解耦服务、处理后台任务和实现异步...

    飞塔中文V4.3-14应用控制

    - 与早期版本相比,现在的代理无需专门监听特定端口即可工作。 3. **全代理支持**: - 3.0版本提供了对HTTP、POP3、IMAP、SMTP、IM、NTP、FTP等多种协议的支持。 - 对于加密连接(如HTTPS、POP3S、IMAPS、SMTPS...

    幻境网盾skiller3.7

    使用方法: 1.在参数设置中选择好工作网卡; 2.检查网关信息和本机信息是否正确,如果不正确,请手动输入,无需保存; 3.点击流量探测或手动添加或自动扫描以填充目标列表; 4.选择要限制网速的主机; 5.开始或...

    谷歌云计算架构详解.pdf

    9. 负载均衡和代理:Google使用各种负载均衡器,包括反向代理,来管理传入的请求负载,并将请求分发到后端服务器。 10. 缓存技术:Google使用Squid缓存技术在互联网边缘加速Web访问。 11. 容错和备份:Google的...

    谷歌推广产品介绍.pptx

    谷歌不仅提供搜索服务,还拥有众多其他产品,如Google Video、Google Talk、Gmail、Local Search、Desktop Search、AdSense、Book Search、Enterprise、Mobile Search、Google Earth等,形成了一个多元化的产品家族...

    电脑报董师傅热线系统疑难问答分享.pdf

    解决方法可以是使用安装盘进行修复安装,或者通过安全模式尝试修复。 3. "添加/删除程序"面板空白:这可能是由于某些系统文件损坏,可以尝试运行sfc /scannow命令来扫描并修复系统文件。 4. Outlook收邮件死机:...

    web.py中文教程

    2. **调试模式下的 Session**: 在开发环境中安全地使用 Session。 3. **模板中的 session**: 在 HTML 模板中访问和更新 session 数据。 4. **Cookie 操作**: 创建、读取和修改客户端的 Cookie。 5. **用户认证**: ...

    msmtp源程序实现了嵌入式消息的发送,并结合mutt壳能量实现了电子邮件的发送和接收.zip

    通过配置`mutt` 使用`msmtp` 作为其SMTP代理,用户可以在`mutt` 的友好界面下编辑邮件,然后利用`msmtp` 的功能将邮件发送出去。这样的组合提供了离线撰写邮件的能力,同时保持了命令行操作的效率。 对于标签“C#”...

    基于java的邮箱管理服务器设计与实现本科毕业设计.doc

    1. **服务器平台**:使用Java的Servlet和JSP技术实现Web接口,处理用户请求,与后端数据库进行交互。 2. **数据库实现**:存储用户信息、邮件内容和元数据,可能使用SQL数据库,通过ORM框架如Hibernate简化数据库...

    电脑报董师傅热线系统疑难问答参照.pdf

    可尝试使用启动盘进行系统修复或使用安全模式启动电脑进行故障排除。 3. **添加/删除程序面板空白**:这可能是由于注册表相关项损坏,通过运行“regedit”进入注册表编辑器,找到并修复相关键值,或者重新安装...

    TCPIP工作原理教案第10章电子邮件协议.pptx

    电子邮件是互联网上的一种基本通信方式,它以快速、便捷、高效的特点改变了传统的邮政通信模式。在本章中,我们将深入理解电子邮件的工作原理,探讨E-mail地址的结构,并介绍收发邮件过程中涉及的主要协议:SMTP、...

    傲游浏览器3(Maxthon) 3.1.8.1000 正式版

    WindowsXP系统下,使用IE6核心时,淘宝商城订单页面自动跳转为兼容模式,会显示"无法购买". 解决在部分团购网站无法顺利支付的问题. 解决拍拍网使用中信银行无法顺利支付的问题. 安全 修正WebkitBugzilla52688安全问题....

    chrome插件.rar

    考虑到Google的一些服务可能会受到地域限制,此插件可能提供了代理或者绕过限制的功能,让用户能更顺利地使用Google服务,如Gmail、Google Drive或Google搜索等。它也可能协助用户进行登录验证、权限管理等操作,...

Global site tag (gtag.js) - Google Analytics