>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 26434 个阅读者 刷新本主题
 * 贴子主题:  Java设计模式:代理模式 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2019-08-15 21:42:18     消息  查看  搜索  好友  邮件  复制  引用

  

Java设计模式:代理模式

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

    在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。            

介绍

     意图:为其他对象提供一种代理以控制对这个对象的访问。

     主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

     何时使用:想在访问一个类时做一些控制。

     如何解决:增加中间层。

     关键代码:实现与被代理类组合。

     应用范例:

1、Windows 里面的快捷方式。

2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。

3、买火车票不一定在火车站买,也可以去代售点。

4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。

5、spring aop。

                 优点:

1、职责清晰。

2、高扩展性。

3、智能化。

                 缺点:

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

                 使用场景:按职责来划分,通常有以下使用场景:

1、远程代理。

2、虚拟代理。

3、Copy-on-Write 代理。

4、保护(Protect or Access)代理。

5、Cache代理。

6、防火墙(Firewall)代理。

7、同步化(Synchronization)代理。

8、智能引用(Smart Reference)代理。

                 注意事项:

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。                

实现

     我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。

     ProxyPatternDemo,我们的演示类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。

    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

步骤 1

     创建一个接口。                

Image.java

public   interface   Image   {
    void   display ( ) ;
}

步骤 2

     创建实现接口的实体类。        

RealImage.java

public   class   RealImage   implements   Image   {

    private   String   fileName ;

    public   RealImage ( String   fileName ) {
       this . fileName  =  fileName ;
       loadFromDisk ( fileName ) ;
    }

   @ Override
    public   void   display ( )   {
       System . out . println ( " Displaying  "  +  fileName ) ;
    }

    private   void   loadFromDisk ( String   fileName ) {
       System . out . println ( " Loading  "  +  fileName ) ;
    }
}

ProxyImage.java

public   class   ProxyImage   implements   Image {

    private   RealImage   realImage ;
    private   String   fileName ;

    public   ProxyImage ( String   fileName ) {
       this . fileName  =  fileName ;
    }

   @ Override
    public   void   display ( )   {
       if ( realImage  ==  null ) {
          realImage  =  new   RealImage ( fileName ) ;
       }
       realImage . display ( ) ;
    }
}

步骤 3

     当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。        

ProxyPatternDemo.java

public   class   ProxyPatternDemo   {
  
    public   static   void   main ( String [ ]   args )   {
       Image   image  =  new   ProxyImage ( " test_10mb.jpg " ) ;

       //  图像将从磁盘加载  
       image . display ( ) ;
       System . out . println ( " " ) ;
       //  图像不需要从磁盘加载  
       image . display ( ) ;  
    }
}

步骤 4

执行程序,输出结果:

Loading test_10mb.jpg

Displaying test_10mb.jpg

Displaying test_10mb.jpg





程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-11 10:41:07 重新编辑]
  Java面向对象编程-->Swing组件(下)
  JavaWeb开发-->Web运作原理(Ⅳ)
  JSP与Hibernate开发-->持久化层的映射类型
  Java网络编程-->Java反射机制
  精通Spring-->通过Axios访问服务器
  Vue3开发-->Vue CLI脚手架工具
  详细介绍float和double类型的区别
  类连接阶段的验证原理
  十分钟带你搞懂 Java AQS 核心设计与实现!
  Java并发之volatile关键字内存可见性问题
  Java异常堆栈信息以字符串形式输出
  超详细的Java运算符修炼手册(优秀程序员不得不知道的运算技...
  Java设计模式:迭代器模式
  Java Scoket之java.io.EOFException解决方案
  Java入门实用代码:集合输出
  Java入门实用代码:数组转集合
  Java入门实用代码:文件重命名
  Java程序初始化顺序(一看就懂)
  Java判断一个字符是否为中文字符
  Java程序代码优化技巧
  Java性能优化总结
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。