`
starnc
  • 浏览: 144778 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

为什么要使用代理类(代理模式)

    博客分类:
  • JAVA
阅读更多

文原创作者在博客园.
http://www.cnblogs.com/xiaoqin/archive/2007/08/10/850130.html

 

      代理这个词大家肯定已经非常熟悉,因为现实中接触的很多,其实现实中的东西恰恰可以非常形象和直观地反映出模式的抽象过程以及本质。现在房子不是吵得热火朝天吗?我们就以房子为例,来拨开代理的面纱。

假设你有一套房子要卖,一种方法是你直接去网上发布出售信息,然后直接带要买房子的人来看房子、过户等一直到房子卖出去,但是可能你很忙,你没有时间去处理这些事情,所以你可以去找中介,让中介帮你处理这些琐碎事情,中介实际上就是你的代理。本来是你要做的事情,现在中介帮助你一一处理,对于买方来说跟你直接交易跟同中介直接交易没有任何差异,买方甚至可能觉察不到你的存在,这实际上就是代理的一个最大好处。

接下来我们再深入考虑一下为什么你不直接买房子而需要中介?其实一个问题恰恰解答了什么时候该用代理模式的问题。

原因一:你可能在外地上班,买房子的人没法找到你直接交易。

对应到我们程序设计的时候就是:客户端无法直接操作实际对象。那么为什么无法直接操作?一种情况是你需要调用的对象在另外一台机器上,你需要跨越网络才能访问,如果让你直接coding去调用,你需要处理网络连接、处理打包、解包等等非常复杂的步骤,所以为了简化客户端的处理,我们使用代理模式,在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端,这实际上就是Web Service的工作原理。另一种情况虽然你所要调用的对象就在本地,但是由于调用非常耗时,你怕影响你正常的操作,所以特意找个代理来处理这种耗时情况,一个最容易理解的就是Word里面装了很大一张图片,在word被打开的时候我们肯定要加载里面的内容一起打开,但是如果等加载完这个大图片再打开Word用户等得可能早已经跳脚了,所以我们可以为这个图片设置一个代理,让代理慢慢打开这个图片而不影响Word本来的打开的功能。申明一下我只是猜可能Word是这么做的,具体到底怎么做的,俺也不知道。

原因二:你不知道怎么办过户手续,或者说除了你现在会干的事情外,还需要做其他的事情才能达成目的。

对应到我们程序设计的时候就是:除了当前类能够提供的功能外,我们还需要补充一些其他功能。最容易想到的情况就是权限过滤,我有一个类做某项业务,但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理类,要求所有请求必须通过该代理类,由该代理类做权限判断,如果安全则调用实际类的业务开始处理。可能有人说为什么我要多加个代理类?我只需要在原来类的方法里面加上权限过滤不就完了吗?在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小,就拿刚才的例子来说,如果你将权限判断放在当前类里面,当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因,现在如果权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。

好了,原理的东西已经讲得差不多了,要是再讲个没完可能大家要扔砖头了。呵呵,接下来就看看怎么来实现代理。

代理模式的实现:

其实代理模式还是很容易实现的,随便举个例子,比如你有一个类负责返回员工的薪资信息,如下:

 

public class BusinessClass

{

public double GetPayroll(string employee)

{

//返回薪资结果

return 1000;

}

}

由于薪资信息是公司的机密信息,不是谁都能调用查看,所以我们为该类做一个代理来做用户身份的验证,代码如下:

public class Proxy

{

private BusinessClass bc;

public Proxy(BusinessClass bc)

{

this.bc=bc;

}

public double GetPayroll(string user)

{

//判断user权限

//如果不符合返回null,或者抛出异常

if( IsManage(user) )

{

return bc.GetPayroll(”张三”);

}

throw new Exception(”你没有该权限。”);

}

}

注意:代理类需要使用被代理类来做业务逻辑,所以代理类需要包含被代理类的实例,这跟适配器模式是一样的。

到目前为止目的其实已经达到了,但是现实中我们常常会再为代理类和被代理类抽象出一个公共接口,如下:

public interface IBusinessClass

{

double GetPayroll(string user);

}

 

      很多人肯定会问为什么要抽象这个接口呢?其实抽象接口有一个最大的原因就是约束双方的行为!什么意思呢?其实就是我逼迫Proxy必须实现某些方法,而这些方法恰恰是对外公开的主要业务方法。当然也可以靠程序员自律,但是多一个约束总归是好的,至少如果没有实现指定方法我们可以在编译期就发现错误,总比执行时才能发现错误要好。另外的原因可能都得归结到使用接口的好处上去了,这里不再赘述,自己去查接口的文章介绍了。

分享到:
评论
2 楼 hxl860217 2014-01-14  
1 楼 dominic6988 2010-09-29  
不错,写的很好,看过后我一下子明白了好多关于代理的使用场合,使用原因,还有举例也很好很生动,是不篇不错的好文章。

相关推荐

    1、不引用服务使用WCF,手动编写代理类 2、局域网内远程开关机(开机:广播模式,远程唤醒 关机:wcf调用客户端关机程序)

    通常情况下,我们使用WCF时会通过Visual Studio的“添加服务引用”功能自动生成客户端代理类,但这需要服务端已经运行并且可以被发现。然而,如果服务不可用或我们希望更灵活地控制通信过程,我们可以选择手动创建...

    代理模式java代码 Proxy(5) 2个代理类

    在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...

    代理模式的使用示例程序

    代理模式是一种设计模式,它在软件工程中扮演着重要的角色,允许我们为其他对象提供一个替代接口,以控制对原始对象的访问。这种模式的主要目的是为了增加灵活性、安全性或者在不修改原有对象的情况下,增强或扩展其...

    android使用signalr代理模式和非代理模式

    在非代理模式下,不使用SignalR自动生成的代理类,而是直接通过`HubConnection`和`HubInvocation`对象来构建和发送消息。这种方式需要手动编写更多的代码,以构造和解析数据,但可以提供更大的灵活性和控制权。非...

    java中的三种代理模式

    在Java编程中,代理模式是一种常用的面向对象设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式通常用于增加额外的功能,如日志、权限检查等,或者为了创建虚拟代理以提高性能。以下是Java...

    设计模式实现——代理模式

    例如,对于一个Web服务,我们可能需要在用户访问资源前进行身份验证,这就是一个很好的使用代理模式的例子。通过创建一个代理类,它首先检查用户权限,如果权限合法,则调用实际的服务处理请求。 总的来说,代理...

    Java 静态代理模式

    Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,同时不改变原有对象的代码。在Java中,静态代理是通过在代理类中显式实现目标接口来实现的。下面将详细介绍静态代理模式...

    Java代理模式Java动态代理

    - `Class[] interfaces`: 代理类要实现的接口列表。 - `InvocationHandler h`: 指派方法调用的调用处理程序。 **4. 示例代码** 为了更好地理解Java动态代理的工作原理,下面是一个简单的代码示例: 1. **定义...

    设计模式之代理模式Proxy

    具体到这个名为`TestProxy`的压缩包文件,可能包含了一个或多个示例,演示了如何在Java中使用代理模式。可能包括了真实对象、代理对象的实现,以及客户端代码如何通过代理对象来调用真实对象的方法。通过分析这些...

    Java设计模式-代理模式例子

    代理模式是这些模式中的一种,它的主要作用是在不改变原有对象行为的前提下,为对象添加额外的功能或者控制访问。在这个“Java设计模式-代理模式例子”中,我们将深入探讨代理模式的概念、实现方式以及它在实际开发...

    JAVA设计模式之代理模式实例

    代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的方法前后添加额外的功能,如日志记录、权限控制等。代理...

    java代理模式

    代理模式的核心思想是为一个对象提供一个代理,并由代理对象控制对原对象的引用。在Java中,代理模式有静态代理和动态代理两种实现方式。 首先,我们来详细了解一下静态代理。在静态代理中,我们需要创建一个代理类...

    代理模式 C++实现

    代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 ...代理模式就是继承至同一父类的子类,在这些子类中我们选择一个代理类,这个代理类主要是用来处理其它子类相同功能不同实现的调用。

    设计模式之代理模式proxy

    代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对该对象的访问。通过代理,可以在不修改原有对象的情况下,增加额外的功能或控制访问权限。 ### 1. 代理模式的角色 - **...

    Java设计模式——代理设计模式(静态代理和动态代理)

    动态代理的优势在于,当我们有多组接口需要代理时,只需要一个`InvocationHandler`就可以处理所有的代理逻辑,无需为每个接口创建单独的代理类。 总结来说,无论是静态代理还是动态代理,它们都是为了在不修改原始...

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

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

    Android设计模式之代理模式(Proxy Pattern)

    代理模式的核心思想是创建一个代理类,该类作为原对象的代理,它拥有与原对象相同的方法接口,但在调用这些方法时,代理类可以执行一些额外的操作。这些额外的操作可以包括但不限于验证、日志记录、事务管理、缓存等...

    设计模式--代理模式

    在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象提供一种代理以控制这个对象的访问”。这种模式的主要目的是在不改变原有对象行为的基础上,增加额外的功能或者...

    cas代理模式代码示例

    在IT行业中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或控制访问。在本示例中,我们将重点讨论如何在Java环境下使用代理模式来实现代理逻辑,特别是在CAS(Central ...

    面向对象23种设计模式之代理模式

    在代理模式中,代理类作为真实对象的代表,它可以在客户端与真实对象交互时添加额外的行为,如监控、安全管理或者缓存等。 代理模式的核心思想是通过代理类来控制对原始对象的访问,这种控制可以体现在多个方面。...

Global site tag (gtag.js) - Google Analytics