博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式]静态代理模式
阅读量:7089 次
发布时间:2019-06-28

本文共 2203 字,大约阅读时间需要 7 分钟。

•代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

•在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

•代理模式一般涉及到的角色有

–抽象角色:声明真实对象和代理对象的共同接口
–代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,
同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
–真实角色:代理角色所代表的真实对象,是我们最终要引用的对象

•参见程序Subject.java

•参见程序RealSubject.java
•参见程序ProxySubject.java
•参见程序Client.java

Subject.java

1 package cn.itcast.proxy;2 3 //定义一个抽象类,代理角色和真实角色都要实现这个共同的抽象类4 public abstract class Subject {5     //定义一个方法,这个方法就好比中介和房东都有向外租房子的方法6     public abstract void request();7 }

RealSubject.java

1 package cn.itcast.proxy;2 3 //这个类好比是真正的房东.实现向外租房子的方法4 public class RealSubject extends Subject{5     public void request() {6         System.out.println("真正的房东向外租房子");7     }8 }

ProxySubject.java

1 package cn.itcast.proxy; 2  3 //这个类是好比是中介(代理房东向外租房子),和房东(RealSubject)共同实现了Subject抽象类(接口) 4 public class ProxySubject extends Subject { 5     //代理类(中介)要有一个真实类(RealSubject)的一个引用 6     private RealSubject realSubject; 7      8     public void request() { 9         this.preRequest();//this就是ProxySubject的一个对象  ProxySubject proxy = new ProxySubject.10         if(null == realSubject){11             realSubject = new RealSubject();12         }13         realSubject.request();//真实角色完成事情14         this.bacRequest();15     }16     //代理对象可以在真实角色完成的前后增加一些自己的方法.17     //就好比中介先要领房客看房(preRequest()方法),18     //然后和房东,房客一起完成租房(request()方法),19     //最后收取房客钱(bacRequest()方法)20     private void preRequest(){21         System.out.println("中介领房客看房子");22     }23     private void bacRequest(){24         System.out.println("中介向房客收钱");25     }26 }

Client.java

1 package cn.itcast.proxy; 2 //这个类就好比是房客要租房子 3 // 4 public class Client { 5     public static void main(String[] args) { 6         Subject porxySubject = new ProxySubject(); 7         porxySubject.request(); 8     } 9 }10     /*11     打印内容:12         中介领房客看房子13         真正的房东向外租房子14         中介向房客收钱15     */

 

•由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,

现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。
•另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。
但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?
这个问题可以通过Java的动态代理类来解决

 

PS:我总结的关于Java动态代理的博文:

 

转载地址:http://otfql.baihongyu.com/

你可能感兴趣的文章
虚拟化技术总览
查看>>
飞天,进化!
查看>>
20.3. PHP_INI
查看>>
72.11. this is incompatible with sql_mode=only_full_group_by
查看>>
C# 海康DVR客户端开发系列(3)—— 连接DVR和图像预览
查看>>
为创业我做了十年的程序员,你告诉我“程序员不适合创业”?!
查看>>
mokoid android open source HAL hacking in a picture
查看>>
RCF库ClientStub.setAutoReconnect
查看>>
Google Chrome Resize Plugin
查看>>
java编程之:Unsafe类
查看>>
序列作为主键使用的原理、优缺点讨论
查看>>
iOS - AutoLayout
查看>>
如何将dubbo封装成http协议
查看>>
Android版本和API Level对应关系
查看>>
[20150806]scn headroom.txt
查看>>
使用shell脚本查看数据库负载情况
查看>>
【MOS】12c DataPump EXPORT (EXPDP) Enhancements (文档 ID 2171666.1)
查看>>
2018年,5个关于区块链趋势的基本预测
查看>>
美国洛杉矶之行
查看>>
教你用深度学习LSTM网络预测流行音乐趋势(附代码)
查看>>