博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
11代理模式Proxy
阅读量:5819 次
发布时间:2019-06-18

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

一、什么是代理模式

  Proxy模式又叫做代理模式,是构造型的设计 模式之一,它可以为其他对象提供一种代理(Proxy)以 控制对这个对象的访问。

  所谓代理,是指具有与代理元(被代理的对象)具有 相同的接口的类,客户端必须通过代理与被代理的目标 类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。

 

二、代理模式的结构

三、代理模式的角色和职责

  subject(抽象主题角色): 真实主题与代理主题的共同接口。

  RealSubject(真实主题角色):      定义了代理角色所代表的真实对象。

  Proxy(代理主题角色):    含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。

 

四、动态代理

  1. InvocationHandler 接口 2. invoke方法 3. Proxy.newProxyInstance();

 

没用代理模式

主题

1 //主题2 public interface Subject {3     public  void sailBook();4 }

现实主题

1 //现实主题2 public class RealSubject implements Subject {3 4     public void sailBook() {5         System.out.println("卖书");6     }7 }

代理主题

1 //代理主题 2 public class ProxySubject implements Subject{ 3     private RealSubject realSubject; 4  5     public void sailBook() { 6         dazhe(); 7         if(realSubject == null) { 8             realSubject = new RealSubject(); 9         }10         realSubject.sailBook();11         give();12     }13     14     public void dazhe() {15         System.out.println("打折");16     }17     18     public void give() {19         System.out.println("赠送代金券");20     }21 }

测试

1 public class MainClass {2     public static void main(String[] args) {3         ProxySubject proxySubject = new ProxySubject();4         proxySubject.sailBook();5     }6 }

==============================================================

使用代理模式

主题

1 //主题2 public interface Subject {3     public  void sailBook();4 }

真实主题

1 //真实主题2 public class RealSubject implements Subject {3 4     public void sailBook() {5         System.out.println("卖书");6     }7 }

My处理程序  实现 调用处理程序

1 public class MyHandler implements InvocationHandler { 2     private RealSubject realSubject; 3      4     public void setRealSubject(RealSubject realSubject) { 5         this.realSubject = realSubject; 6     } 7  8     public Object invoke(Object proxy, Method method, Object[] args){ 9         Object result = null;10         dazhe();11         try {12             result = method.invoke(realSubject, args);13         } catch (IllegalArgumentException e) {14             e.printStackTrace();15         } catch (IllegalAccessException e) {16             e.printStackTrace();17         } catch (InvocationTargetException e) {18             e.printStackTrace();19         }20         give();21         return result;22     }23     24     public void dazhe() {25         System.out.println("打折");26     }27     28     public void give() {29         System.out.println("赠送代金券");30     }31 }

测试

1 import java.lang.reflect.Proxy; 2  3 public class MainClass { 4     public static void main(String[] args) { 5         RealSubject realSubject = new RealSubject(); 6         MyHandler myHandler = new MyHandler(); 7         myHandler.setRealSubject(realSubject); 8          9         Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(),             realSubject.getClass().getInterfaces(), myHandler);10         proxySubject.sailBook();11     }12 }

 

转载于:https://www.cnblogs.com/justdoitba/p/9033079.html

你可能感兴趣的文章
WCF
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>
Android实例-录音与回放(播放MP3)(XE8+小米2)
查看>>
CSS——(2)与标准流盒模型
查看>>
MYSQL 基本SQL语句
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
shell编程笔记六:实现ll命令
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
《Linux内核修炼之道》 之 高效学习Linux内核
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>
让前端小姐姐愉快地开发表单
查看>>
Web前端JQuery入门实战案例
查看>>
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>
iOS \U7ea2 乱码 转换
查看>>