经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式之代理模式(proxy pattern)
来源:cnblogs  作者:alpha_panda  时间:2019/6/3 9:01:19  对本文有异议

代理模式的本质是一个中间件,主要目的是解耦合服务提供者和使用者。使用者通过代理间接的访问服务提供者,便于后者的封装和控制。是一种结构性模式。

1.目的

为外部调用者提供一个访问服务提供者的代理对象。

2.动机

限制对目标对象的直接访问,降低耦合度。

3.优缺点

优点:

优点: 

  • 低耦合
  • 易扩展
  • 灵活度高

缺点:

  • 间接访问可能会延迟请求相应
  • 增加工作量

4.分类

  • 静态代理
  • 动态代理

  代理类本身的实现可能并不简单,加上每一个需要代理的对象均均需要实现一个代理类,其工作量本身比较大,易出错。

  所谓动态代理(DynamicProxy)是指在程序运行时动态的生成对目标对象的访问接口。

  本文主要介绍前者,关于后者可以参考JDK自带的动态代理。

5.主要用途

代理模式在以下场景比较适用:

     1、远程代理。 2、虚代理。 3、保护代理。4、智能指引代理。5、写时复制(Copy-on-Write)代理。  6、缓存代理。 7、防火墙代理。 8、同步化代理。

6.原理

下面是GoF介绍典型的代理模式UML类图

Subject:

 定义RealSubject对外的接口,且这些接口必须被Proxy实现,这样外部调用proxy的接口最终都被转化为对realsubject的调用。

RealSubject:

 真正的目标对象。

Proxy:

 目标对象的代理,负责控制和管理目标对象,并间接地传递外部对目标对象的访问。

  1. Remote Proxy: 对本地的请求以及参数进行序列化,向远程对象发送请求,并对响应结果进行反序列化,将最终结果反馈给调用者;
  2. Virtual Proxy: 当目标对象的创建开销比较大的时候,可以使用延迟或者异步的方式创建目标对象;
  3. Protection Proxy: 细化对目标对象访问权限的控制;

7.实现

 下面我们使用两个例子来实际体验一下代理模式的应用

网络代理

对于一些国内不能直接访问的网站,合法的使用的网络代理可以实现对目标网站的访问;

定义公共接口类Server:

  1. public interface Server{
  2. void visit(String url);
  3. }

  代理服务器ProxyServer:

  1. public class ProxyServer implements Server{
  2. private RealServer realServer;
  3. public ProxyServer(String serverName){
  4. this.realServer = new RealServer(serverName);
  5. }
  6. @Override
  7. public void visit(String url) {
  8. realServer.visit(url);
  9. }
  10. }

  目标服务器RealServer:

  1. public class RealServer implements Server {
  2. private String serverName;
  3. public RealServer(String serverName) {
  4. this.serverName = serverName;
  5. System.out.println("This is " + serverName);
  6. }
  7. @Override
  8. public void visit(String url) {
  9. response(url);
  10. }
  11. private void response(String res) {
  12. System.out.println("This is response of " + res + " from server:" + serverName);
  13. }
  14. }

 演示:

  1. public class Demo {
  2. public static void main(String[] args) {
  3. Server server = new ProxyServer("www.google.com");
  4. server.visit("map.google.com");
  5. }
  6. }

智能指针引用计数

下面使用代理模式简单的模拟指针引用计数问题

接口类Obj:

  1. public interface Obj{
  2. void GetAttr();
  3. Obj copy();
  4. void delete();
  5. }

  智能指针类SmartPointer:

  1. public class SmartPointer implements Obj{
  2. private RealObj realObj;
  3. private int counter = 1;
  4. public SmartPointer(String objType){
  5. this.realObj = new RealObj(objType);
  6. }
  7. @Override
  8. public void GetAttr() {
  9. if(counter > 0) {
  10. realObj.GetAttr();
  11. }
  12. System.out.println("Smart Ref: " + counter);
  13. }
  14. public Obj copy() {
  15. if(counter > 0) {
  16. counter += 1;
  17. return this;
  18. }
  19. System.out.println("Invalid Pointer!");
  20. return null;
  21. }
  22. public void delete() {
  23. if(counter > 0) {
  24. counter -= 1;
  25. if(0 == counter) {
  26. realObj = null;
  27. }
  28. }
  29. else {
  30. System.out.println("Invalid Pointer!");
  31. }
  32. }
  33. }
View Code

 被引用对象类RealObj:

  1. public class RealObj implements Obj {
  2. private String objType;
  3. public RealObj(String objType) {
  4. this.objType = objType;
  5. System.out.println("Create Obj: " + objType);
  6. }
  7. @Override
  8. public void GetAttr() {
  9. System.out.println("get attr of real obj " + objType);
  10. }
  11. @Override
  12. public Obj copy() {
  13. // TODO Auto-generated method stub
  14. return null;
  15. }
  16. @Override
  17. public void delete() {
  18. // TODO Auto-generated method stub
  19. }
  20. }
View Code

 参考:

GoF《Design Patterns: Elements of Reusable Object-Oriented Software》

https://www.runoob.com/design-pattern/proxy-pattern.html

原文链接:http://www.cnblogs.com/yssjun/p/10889022.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号