>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 26435 个阅读者 刷新本主题
 * 贴子主题:  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面向对象编程-->按面向对象开发的基础范例
  JavaWeb开发-->Servlet技术详解(Ⅰ)
  JSP与Hibernate开发-->数据库事务的并发问题的解决方案
  Java网络编程-->通过JavaMail API收发邮件
  精通Spring-->创建综合购物网站应用
  Vue3开发-->Vue组件开发基础
  Doubles swept by Braves, set out 14 times in 3-0 loss
  为网站代码块pre标签增加一个复制代码按钮代码
  Java内存设置详解(含内存溢出问题的解决)
  Java设计模式: 单一职责原则和依赖倒置原则详解
  我是如何把一个15分钟的程序优化到了10秒的
  18 张图弄懂面试官必问的一致性哈希
  用注解去代替if-else的技巧
  Java是如何实现自己的SPI机制的?
  编程语言搜索量排行:用十年数据告诉你什么最受欢迎
  Synchronized与ReentrantLock区别总结
  volatile 与 synchronized 详解
  Java入门实用代码:死锁及解决方法
  Java入门实用代码:获取远程文件大小
  Java入门实用代码:修改链表LinkedList
  Java 入门实用代码:汉诺塔算法
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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