设计模式(代理)
Posted 虫儿aqa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式(代理)相关的知识,希望对你有一定的参考价值。
什么是代理模式及其作用
Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
优点:
(1).职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
结构
一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
下面看个列子
public interface KindWomen { public void throwEye(); public void doSomething(); }
public class PJL implements KindWomen{ public void throwEye(){ System.out.println("潘金莲抛媚眼"); } public void doSomething(){ System.out.println("潘金莲..."); } }
public class XMQ { public static void main(String[] args) { PJL pjl= new PJL(); KindWomen wp = new WP(pjl); pjl.throwEye(); } }
西门庆是无法直接知道潘金莲抛媚眼的,通过王婆代理
public class WP implements KindWomen{ private KindWomen kw;
//构造方法用来收集传来的值 public WP(KindWomen kw){ this.kw = kw; } public void throwEye() { kw.throwEye(); } public void doSomething() { kw.doSomething(); } }
运行就结果
动态代理
动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。
动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。
(就是上述例子没有不用王婆了)
Java.lang.reflect.Proxy类可以直接生成一个代理对象
Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类 ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。 Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。 InvocationHandler:策略(方案)设计模式的应用。如何代理? InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行 Object proxy:代理对象本身的引用。一般用不着。 Method method:当前调用的方法。 Object[] args:当前方法用到的参数
下面看例子
public class XMQ { public static void main(String[] args) { final KindWomen kw = new PJL(); KindWomen proxy = (KindWomen) Proxy.newProxyInstance(kw.getClass().getClassLoader(), kw.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(kw, null); } }); proxy.throwEye(); proxy.doSomething(); } }
.结果
以上是关于设计模式(代理)的主要内容,如果未能解决你的问题,请参考以下文章