`

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

阅读更多
一、引子

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

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

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

  二、定义和分类

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

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

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

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

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

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

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

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

  三、结构

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

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

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

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

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

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

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

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

  四、举例

  以论坛中已注册用户和游客的权限不同来作为第一个例子:已注册的用户拥有发帖,修改自己的注册信息,修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。为了简化代码,更好的显示出代理模式的骨架,我们这里只实现发帖权限的控制。 首先我们先实现一个抽象主题角色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下来实现,这个是绝对没有问题的,而且在很多介绍设计模式的书和文章中使用。两种方式的实现有兴趣的可以来尝试一下。

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

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

  五、总结

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

分享到:
评论

相关推荐

    深入浅出设计模式C#Java版

    本资源"深入浅出设计模式C#Java版"是针对这两种主流编程语言介绍设计模式的经典著作,旨在帮助开发者理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C#中,可以使用`密封`和`...

    深入浅出设计模式(HEAD_FIRST设计模式)电子书+java代码

    《深入浅出设计模式》是基于HEAD FIRST系列的著名设计模式教程,专为初学者打造,旨在用生动直观的方式帮助读者理解复杂的设计模式概念。这本书以其独特的图文并茂的讲解方式,使得学习过程更为轻松有趣。书中涵盖了...

    深入浅出Java 23种设计模式.rar

    本资料"深入浅出Java 23种设计模式"旨在帮助开发者理解和应用这23种经典设计模式。 首先,我们要了解设计模式的三大类别:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建过程,如单例模式...

    深入浅出设计模式源码 java

    《深入浅出设计模式源码 Java》是一本深入解析Java设计模式的著作,它通过易于理解的方式揭示了软件设计中的核心原则和模式。设计模式是软件工程中的宝贵经验总结,它们是解决常见问题的最佳实践,可以帮助开发者...

    关于java深入浅出设计模式

    本资料“关于java深入浅出设计模式”旨在帮助读者全面理解和掌握Java中的设计模式。 一、单例模式(Singleton) 单例模式确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造器和静态工厂...

    深入浅出学spring

    《深入浅出学Spring》视频教程不仅介绍了Spring框架的基本概念和原理,还详细讲解了如何利用Spring框架的各种特性来构建高质量的Java应用程序。对于初学者而言,这是一个非常宝贵的学习资源。通过系统地学习这些知识...

    图解Java设计模式笔记总结word版本.rar

    本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析各种设计模式。以下是基于这个主题的详细知识点讲解: 1. **设计模式的分类** - **创建型模式**:如单例(Singleton)、工厂...

    Java与模式(阎宏著)源码

    《Java与模式》是阎宏博士的一本经典著作,它深入浅出地介绍了如何在Java编程中应用设计模式。这本书的源码包含了全书各章节的实例代码,这对于学习和理解书中理论提供了直观且实践性的支持。以下是基于该书籍源码的...

    《设计模式》中文版

    这本书深入浅出地讲解了如何在实际编程中应用这些模式,以提高代码的可读性、可维护性和可扩展性。设计模式是经验丰富的开发者们在解决常见问题时形成的通用解决方案,它们为软件开发提供了标准化的方法,是Java...

    Java设计模式(图解+框架源码分析+实战)- 黑马课件

    本课程基于黑马程序员提供的课件,通过图解、框架源码分析及实战的方式,深入浅出地讲解了Java设计模式的核心知识。 在Java设计模式的学习过程中,通常会涉及到以下几个方面: 1. **单例模式**:确保一个类只有一...

    深入浅出Flex,经典教程

    《深入浅出Flex》经典教程是一本专注于Adobe Flex技术的深度解析书籍,旨在帮助读者全面理解和掌握Flex在开发富互联网应用程序(RIA)中的应用。Flex是基于ActionScript和MXML的开源框架,它允许开发者创建交互性强...

    Java设计模式

    Java设计模式是软件工程中的一种最佳实践,它提供了一套标准的解决方案...虽然没有具体的文件内容,但可以想象博主可能会通过JXL库的使用,深入浅出地阐述如何在实际项目中运用设计模式来优化代码结构和提高代码质量。

    『新鲜出炉,深入浅出java百度云(csdn)————程序.pdf

    以上只是Java面试中常见的一些知识点,实际上涵盖的范围更广泛,包括设计模式、网络编程、数据库连接池、缓存技术、序列化等。对于Java开发者来说,不断学习和深入理解这些概念是提升专业技能的关键。

    设计模式

    7. **《设计模式之禅》的价值**:这本书深入浅出地介绍了设计模式的原理和实践,通过实例解析,帮助读者理解和掌握设计模式的精髓。它不仅适合初学者入门,也对有经验的开发者有很高的参考价值,是一本值得反复研读...

    Head_First_设计模式

    本书之所以能够脱颖而出,不仅在于其深入浅出地讲解了设计模式这一复杂主题,更在于其独特的编写风格和教育方法,将神经生物学、认知科学以及学习理论融入其中,使得复杂的概念变得易于理解和记忆。 ### 设计模式...

    深入浅出ES6

    ### 深入浅出ES6 #### ES6概述 ES6,即ECMAScript 2015,是JavaScript编程语言的一个重要版本,它带来了大量的改进和新特性,极大地提升了开发者的编码体验和程序的运行效率。由于JavaScript是前端开发的核心语言...

    Design Pattern(设计模式)讲义

    侯捷老师的讲义深入浅出地介绍了设计模式的概念和应用,不仅适合初学者了解设计模式的基本思想,也为高级开发者提供了更深层次的理解。通过学习这些设计模式,开发者可以编写出更加灵活、可扩展和易于维护的代码。

Global site tag (gtag.js) - Google Analytics