基于Java的代理设计模式_JSP编程

 一、引子

  我们去科技市场为自己的机器添加点奢侈的配件,很多DIYer都喜欢去找代理商,因为在代理商那里拿到的东西不仅质量有保证,而且价格和售后服务上都会好很多。客户通过代理商得到了自己想要的东西,而且还享受到了代理商额外的服务;而生产厂商通过代理商将自己的产品推广出去,而且可以将一些销售服务的任务交给代理商来完成(当然代理商要和厂商来共同分担风险,分配利润),这样自己就可以花更多的心思在产品的设计和生产上了。

  在美国,任何企业的产品要想拿到市场上去卖就必须经过代理商这一个环节,否则就是非法的。看来代理商在商业运作中起着很关键的作用。 不小心把话题扯远了,回过头来,那么在我们的面向对象的程序设计中,会不会有代理商这样的角色呢?来看这篇文章的人肯定不会说:没有!

  那么就跟着这篇文章来看看代理模式的奇妙吧。

  二、定义和分类

  代理模式在设计模式中的定义就是:为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。

  那么什么时候要使用代理模式呢?在对已有的方法进行使用的时候出现需要对原有方法进行改进或者修改,这时候有两种改进选择:修改原有方法来适应现在的使用方式,或者使用一个“第三者”方法来调用原有的方法并且对方法产生的结果进行一定的控制。第一种方法是明显违背了“对扩展开放、对修改关闭”(开闭原则),而且在原来方法中作修改可能使得原来类的功能变得模糊和多元化(就像现在企业多元化一样),而使用第二种方式可以将功能划分的更加清晰,有助于后面的维护。所以在一定程度上第二种方式是一个比较好的选择!

  当然,话又说回来了,如果是一个很小的系统,功能也不是很繁杂,那么使用代理模式可能就显得臃肿,不如第一种方式来的快捷。这就像一个三口之家,家务活全由家庭主妇或者一个保姆来完成是比较合理的,根本不需要雇上好几个保姆层层代理:)

  根据《Java与模式》书中对代理模式的分类,代理模式分为8种,这里将几种常见的、重要的列举如下:

  1. 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。比如:你可以将一个在世界某个角落一台机器通过代理假象成你局域网中的一部分。

  2. 虚拟(Virtual)代理:根据需要将一个资源消耗很大或者比较复杂的对象延迟的真正需要时才创建。比如:如果一个很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,这个大图片可能就影响了文档的阅读,这时需要做个图片Proxy来代替真正的图片。

  3. 保护(Protect or Access)代理:控制对一个对象的访问权限。比如:在论坛中,不同的身份登陆,拥有的权限是不同的,使用代理模式可以控制权限(当然,使用别的方式也可以实现)。

  4. 智能引用(Smart Reference)代理:提供比对目标对象额外的服务。比如:纪录访问的流量(这是个再简单不过的例子),提供一些友情提示等等。

  代理模式是一种比较有用的模式,从几个类的“小结构”到庞大系统的“大结构”都可以看到它的影子。

  三、结构

  代理模式中的“代理商”要想实现代理任务,就必须和被代理的“厂商”使用共同的接口(你可以想象为产品)。所以自然而然你会想到在java中使用一个抽象类或者接口(推荐)来实现这个共同的接口。于是代理模式就有三个角色组成了:

  1.抽象主题角色:声明了真实主题和代理主题的共同接口。

  2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。

  3.真实主题角色:定义真实的对象。

  使用类图来表示下三者间的关系如下:


  当然,图上所示的是代理模式中的一个具体情况。而代理模式可以非常灵活的使用其他方式来实现,这样就与图上所示有很大的区别。

  也许,现在你已经对代理模式已经有了一个宏观的认识了,下面我们来看看怎么实际的使用代理模式。

  四、举例

  以论坛中已注册用户和游客的权限不同来作为第一个例子:已注册的用户拥有发帖,修改自己的注册信息,修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。为了简化代码,更好的显示出代理模式的骨架,我们这里只实现发帖权限的控制。 首先我们先实现一个抽象主题角色MyForum,里面定义了真实主题和代理主题的共同接口——发帖功能。

  代码如下:

  public interface MyForum

  {

  public void AddFile();

  }

  这样,真实主题角色和代理主题角色都要实现这个接口。其中真实的主题角色基本就是将这个接口的方法内容填充进来。所以在这里就不再赘述它的实现。我们把主要的精力放到关键的代理主题角色上。代理主题角色代码大体如下:

  public class MyForumProxy implements MyForum
  {
  private RealMyForum forum ;
  private int permission ; //权限值

  public MyForumProxy(int permission)
  {
  forum = new RealMyForum()
  this.permission = permission ;
  }

  //实现的接口

  public void AddFile()
  {
  //满足权限设置的时候才能够执行操作
  //Constants是一个常量类
  if(Constants.ASSOCIATOR == permission)
  {
   forum.AddFile();
  }
  else
   System.out.println("You are not a associator of MyForum ,please registe!");
  }
  }

  这样就实现了代理模式的功能。当然你也可以在这个代理类上添加自己的方法来实现额外的服务,比如统计帖子的浏览次数,记录用户的登录情况等等。

  还有一个很常见的代理模式的使用例子就是对大幅图片浏览的控制。在我们常见的网站上面浏览图文的信息时,不知道你有没有注意到,图片位置放置的是经过缩小的,当有人要仔细的查看这个图片时,可以通过点击图片来激活一个链接,在一个新的网页打开要看的图片 。这样对于提高浏览速度是很有好处的,因为不是每个人都要去看仔细图上的信息。这种情况就可以使用代理模式来全面实现。这里我将思路表述出来,至于实现由于工作原因,就不表述了,至于这种方式在B/S模式下的真实可行性,我没有确认过,只是凭空的想象。如果不是可行的方式,那这个例子可以放到一个C/S下来实现,这个是绝对没有问题的,而且在很多介绍设计模式的书和文章中使用。两种方式的实现有兴趣的可以来尝试一下。

  我们在浏览器中访问网页时是调用的不是真实的装载图片的方法,而是在代理对象中的方法,在这个对象中,先使用一个线程向浏览器装载了一个缩小版的图片,而在后台使用另一个线程来调用真实的装载大图片的方法将图片加载到本地,当你要浏览这个图片的时候,将其在新的网页中显示出来。当然如果在你想浏览的时候图片尚未加载成功,可以再启动一个线程来显示提示信息,直到加载成功。

  这样代理模式的功能就在上面体现的淋漓尽致——通过代理来将真实图片的加载放到后台来操作,使其不影响前台的浏览。

  五、总结

  代理模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度。不过一定要记住前面讲的使用代理模式的条件,不然的话使用了代理模式不但不会有好的效果,说不定还会出问题的

时间: 2024-09-16 03:05:23

基于Java的代理设计模式_JSP编程的相关文章

开发基于Java的图形用户界面_JSP编程

SWT(Standard Widget Toolkit)是IBM推出的"基于java"的图形界面开发库我之所以说它是"基于java"的意思是程序员编写代码的时候是使用java语言事实上SWT的底层实现是C语言完成的.但是这些对程序员是透明的. 我们使用SWT开发GUI程序的时候直接用SWT API来写.事实上很多java的代码是通过JNI去掉用C代码来实现的.针对不同的平台每个类有不同的实现方式这篇文章的目的不在于讲述SWT的设计原理如果你对这些感兴趣的话可以参考h

深入浅出基于Java的代理设计模式

一.引子 我们去科技市场为自己的机器添加点奢侈的配件,很多DIYer都喜欢去找代理商,因为在代理商那里拿到的东西不仅质量有保证,而且价格和售后服务上都会好很多.客户通过代理商得到了自己想要的东西,而且还享受到了代理商额外的服务:而生产厂商通过代理商将自己的产品推广出去,而且可以将一些销售服务的任务交给代理商来完成(当然代理商要和厂商来共同分担风险,分配利润),这样自己就可以花更多的心思在产品的设计和生产上了. 在美国,任何企业的产品要想拿到市场上去卖就必须经过代理商这一个环节,否则就是非法的.看

Java学习的捷径_JSP编程

1.jdk就是j2se,jdk1.1.8版本以后改成为j2se 下载地址:http://java.sun.com/j2se/downloads.html 2.jre是java运行时环境(jdk1.3版本以后都包含jre)不用单独下载 3.设置环境变量 安装了jdk以后,要配置环境变量 我的电脑->属性->高级->环境变量 添加以下环境变量(假定你的java安装在c:\jdk1.3) java_home=c:\jdk1.3 classpath=.;c:\jdk1.3\lib\dt.jar;

[JAVA]十四种Java开发工具点评_JSP编程

  在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美的,就算是老鸟也很难做出选择.在本文中我简要介绍了常见的十四种Java开发工具的特点,管中窥"器",希望能对大家有所帮助. 1.JDK (Java Development Kit) 2.Java Workshop 3.NetBeans 与Sun Java Studio 5 4.Borl

Java线程模型缺陷_JSP编程

Java 编程语言的线程模型可能是此语言中最薄弱的部分.它完全不适合实际复杂程序的要求,而且也完全不是面向对象的.本文建议对 Java 语言进行重大修改和补充,以解决这些问题. Java 语言的线程模型是此语言的一个最难另人满意的部分.尽管 Java 语言本身就支持线程编程是件好事,但是它对线程的语法和类包的支持太少,只能适用于极小型的应用环境. 关于 Java 线程编程的大多数书籍都长篇累牍地指出了 Java 线程模型的缺陷,并提供了解决这些问题的急救包(Band-Aid/邦迪创可贴)类库.我

Java动态代理实现AOP_JSP编程

目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等.AOP似乎一时之间成了潮流.Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP.本文不是要在理论上具体阐述何为AOP, 为何要进行AOP . 要详细了解学习AOP可以到它老家http://aosd.net去瞧瞧.这里只是意图通过一个简单的例子向初学者展示一下如何来进行AOP. 为了简单起见,例子

基于jsp的井字游戏实例_JSP编程

做一款回忆童年的游戏,这款游戏代码比较简单,主要是掌握算法的原理,但是也有一些需要注意的地方. 游戏界面 进入正题.项目的效果图如下: 游戏有一个开始界面可供选择玩家的角色,然后选择先手是哪一方,接着开始游戏.选择界面做了一个遮罩层,里面提供给用户选择,选择之后便把遮罩层隐藏并开始游戏. 具体实现 说了那么多,可能比较枯燥,下面介绍一下具体的代码实现. 使用一个二维数组panel保存棋盘的状态,1是电脑的值,-1是玩家的值. winArr保存所有可能赢的8个棋位组合:维护computerWin和

深入浅出基于Java的解释器设计模式

设计 一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用不到这个模式,但是看一看还是能受到一定的启发的. 二.定义与结构 解释器模式的定义如下:定义语言的文法,并且建立一个解释器来解释该语言中的句子.它属于类的行为模式.这里的语言意思是使用规定格式和语法的代码. 在GOF的书中指出:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各

深入浅出基于Java的建造设计模式

一.引子 前几天陪朋友去装机店攒了一台电脑,看着装机工在那里熟练的装配着机器,不禁想起来了培训时讲到的建造模式.作为装机工,他们不用管你用的CPU是Intel还是AMD,也不管你的显卡是2000千大元还是白送的,都能三下五除二的装配在一起--一台PC就诞生了!当然对于客户来说,你也不知道太多关于PC组装的细节.这和建造模式是多么的相像啊! 今天就来探讨一下建造模式 二.定义与结构 GOF给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.可以将建造模式的