Proxy 模式
DynamicSubject
• • • • • •
public class DynamicSubject implements InvocationHandler { private Object sub; public DynamicSubject(Object obj) { sub = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
代理类 InvocationHandler ds = new DynamicSubject(rs); // 初始化代理类 Class cls = rs.getClass(); Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.ge tInterfaces(),ds); subject.request(); } }
代理模式-初步了解
• 六子 取钱 • 六子 ATM 取钱 • 六子 银行卡 ATM 取钱 • 六子不能直接操作ATM,但是可以通过 六子不能直接操作ATM,但是可以通过
(银行卡)操作ATM,(银行卡)就是代 (银行卡)操作ATM,(银行卡)就是代 理者. 理者.
代理模式-初步了解
• • • • • • •
类图
MyForum
AddFile()
MyForumReal
AddFile()
பைடு நூலகம்
MyForumProxy
AddFile() MyForumProxy()
抽象主题角色
首先我们先实现一个抽象主题角色MyForum, 首先我们先实现一个抽象主题角色MyForum, 里面定义了真实主题和代理主题的共同接 口—发帖功能。 public interface MyForum •{
什么时候要使用代理模式呢?
• 在对已有的方法进行使用的时候出现需要
对原有方法进行改进或者修改 • 这时候有两种改进选择: • 1:修改原有方法来适应现在的使用方式, 1:修改原有方法来适应现在的使用方式, • 2:使用一个“第三者”方法来调用原有的方 2:使用一个“第三者” 法并且对方法产生的结果进行一定的控制。 (开闭原则)对扩展开放、对修改关闭”。 (开闭原则)对扩展开放、对修改关闭”
public void AddFile();
•}
真实主题角色
• public class MyForumReal implements
MyForum { • public void AddFile() { • System.out.println("可以增加帖子! System.out.println("可以增加帖子! "); • } •}
");
• } •}
• public class Client { • public static void main(String[] args) { • //在 RealSubject rs = new RealSubject(); //在 • • • • • • • • • • •
这里指定被代理类 InvocationHandler ds = new //初始化代理类 DynamicSubject(rs); //初始化代理类 Class cls = rs.getClass(); Subject subject = (Subject)Proxy.newProxyInstance(cls.getClassLoader (),cls.getInterfaces(),ds); subject.request(); TT tt = new TT(); //初始化代 ds = new DynamicSubject(tt); //初始化代 理类 cls = rs.getClass(); subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.ge tInterfaces(),ds); subject.request(); } }
代理模式种类
• 3. 保护(Protect or Access)代理:控制对一个 保护(Protect Access)代理:控制对一个
对象的访问权限。比如:在论坛中,不同的身份 登陆,拥有的权限是不同的,使用代理模式可以 控制权限(当然,使用别的方式也可以实现)。 4. 智能引用(Smart Reference)代理:提供比对 智能引用(Smart Reference)代理:提供比对 目标对象额外的服务。比如:纪录访问的流量 (这是个再简单不过的例子),提供一些友情提 示等等。
他对象提供一种代理以控制对这个对象的 访问。说白了就是,在一些情况下客户不 访问。说白了就是,在一些情况下客户不 想或者不能直接引用一个对象, 想或者不能直接引用一个对象,而代理对 象可以在客户和目标对象之间起到中介作 用,去掉客户不能看到的内容和服务或者 增添客户需要的额外服务。 增添客户需要的额外服务。
Subject
• public interface Subject { • abstract public void request(); •}
RealSubject
• public class RealSubject implements
Subject{ • public void request() •{ • System.out.println("调用RealSubject!"); System.out.println("调用RealSubject! •} •}
结果输出: 结果输出:
• --------------------------------------------------• 调用RealSubject! 调用RealSubject!
再加一个类
• public class TT implements Subject{ • public void request() • { • System.out.println("TT............! System.out.println("TT............!
Java的动态代理类 Java的动态代理类
• 所谓Dynamic Proxy是这样一种class:它是在运行 所谓Dynamic Proxy是这样一种class:它是在运行
时生成的class,在生成它时你必须提供一组 时生成的class,在生成它时你必须提供一组 interface给它,然后该class就宣称它实现了这些 interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些 interface。你当然可以把该class的实例当作这些 interface中的任何一个来用。当然啦,这个 interface中的任何一个来用。当然啦,这个 Dynamic Proxy其实就是一个Proxy,它不会替你 Proxy其实就是一个Proxy,它不会替你 作实质性的工作,在生成它的实例时你必须提供 一个handler,由它接管实际的工作。在使用动态 一个handler,由它接管实际的工作。在使用动态 代理类时,我们必须实现InvocationHandler接口, 代理类时,我们必须实现InvocationHandler接口,
– method.invoke(sub, args); – return null;
• • }
}
Test
• public class Test { • public static void main(String[] args) { • RealSubject rs = new RealSubject(); //在这里指定被 //在这里指定被 • • • • • •
•
代理模式最简单的结构
代理模式就有三个角色组成了: 1.抽象主题角色:声明了真实主题和代理主题的共同接口。 2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角 色相同的接口。 3.真实主题角色:定义真实的对象。
论坛例子
• 以论坛中已注册用户和游客的权限不同来
作为第一个例子: • 已注册的用户拥有发帖,修改自己的注册 信息,修改自己的帖子等功能; • 而游客只能看到别人发的帖子,没有其他 权限。
测试类
• public class Test { • public static void main(String[] args) { • MyForumProxy proxy =new • • •}
MyForumProxy(0); proxy.AddFile(); }
总结
代理模式能够协调调用者和被调用者,能 够在一定程度上降低系统的耦合度。不过 一定要记住前面讲的使用代理模式的条件, 不然的话使用了代理模式不但不会有好的 效果,说不定还会出问题的
当然还有别的也可以, 六子 乙炔喷枪 ATM 取钱 乙炔喷枪 (乙炔喷枪)就是代理者. 乙炔喷枪)就是代理者. ~这时候是犯罪了.国家要抓六子 国家 抓六子 国家没法直接抓六子,(警察)就是代理者 国家没法直接抓六子,(警察)就是代理者 国家 警察 抓六子
代理模式代理模式-定义
• 代理模式在设计模式中的定义就是:为其
Java的动态代理类 Java的动态代理类
• Java动态代理类位于ng.reflect包下,一般 Java动态代理类位于ng.reflect包下,一般 • • • • • •
主要涉及到以下类: (1). Interface InvocationHandler: InvocationHandler: 该接口中仅定义了一个方法Object: 该接口中仅定义了一个方法Object: invoke(Object obj,Method method,Object[] args) 在实际使用时, 第一个参数obj一般是指代理类, 第一个参数obj一般是指代理类, method是被代理的方法,如例中的request(), method是被代理的方法,如例中的request(), args为该方法的参数数组。 args为该方法的参数数组。 这个抽象方法在代理类中动态实现。