代理模式是一种结构型模式,在client和使用的对象间新建一个代理类,通过代理类创建对象调用方法,
优势:代理类是实际类的替代类,能解决调用方与被调用方的耦合,代理也能增强被代理类(拓展一些功能),如:在实现某类的功能时,需要打印日志(spring的AOP就是对动态代理模式的使用)
代理模式分类:
1,静态代理(也叫接口代理):代理和被代理类都需要实现一个公共的接口,实例化在代理类的内部实现
2,动态代理:不需要实现公共接口,对象的实例化,由反射动态注入
问题:年过半百的WQL突然想到了一个遗憾,那就是他还没有女朋友,他决定去找个正常的女票谈恋爱
传统方法:
WQL自己主动的在复杂的社会中找到最合适的那个人
public class text { public static void main(String[] args) { WQL44 E=new WQL44(new nv()); E.succeed(); } } class WQL44{ nv fuqing; public WQL44(nv fuqing) { this.fuqing = fuqing; } public void succeed(){ fuqing.c(); } } class nv{ public void c(){ System.out.print("成功!!!"); }
静态代理实现:
WQL在某征婚平台,发布了征婚公告,如果有配备的平台会提醒WQL
public class text { public static void main(String[] args) { WQL44 E=new WQL44(new Matchmakingplatform(new nv())); E.w(); } } class WQL44{ Matchmakingplatform a; public WQL44(Matchmakingplatform a) { this.a = a; } public void w(){ a.succeed(); }} interface g{ public void succeed(); } class Matchmakingplatform implements g{ //聚合一个被代理对象 g fuqing; //接口类型,都继承接口这样一个代理类可以代理多个类 public Matchmakingplatform(g fuqing) { this.fuqing = fuqing; } public void succeed(){ //增强这个被代理类 System.out.println("MVP"); fuqing.succeed(); }} class nv implements g{ public void succeed(){ System.out.print("成功!!!"); } }
动态代理:
代理模式模式本质上运用的就是反射,提供在程序运行过程中,反射创建对象,实现代理的效果
动态代理分为三类:
基于接口的代理:JDK代理(我们基于接口代理)
基于类的代理:cglib
java字节码实现:javasist
动态代理主要依赖java类中Proxy和invocationhandler这两个接口
两者的作用:
proxy:创建代理的实例对象
invocationhandler:代理实例关联的调用处理程序,通过它来调用方法
方式一:
interface Rent { public void rents(); } public class rent implements Rent { @Override public void rents() { // TODO Auto-generated method stub System.out.print("我要租房子!!!"); } } class proxyrent implements InvocationHandler{ private Rent H ; public Rent getH() { return H; } public void setH(Rent h) { H = h; } /*参数说明: * proxy:代理的对象 * method:代理的方法 * args:方法参数 */ //生成代理实例 public Object rentproxy() { return Proxy.newProxyInstance(this.getClass().getClassLoader(),H.getClass().getInterfaces(),this); } //处理代理实例并返回结果(相当于在代理实例上增强,在运行时反射) @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub Object a=method.invoke(H,args); kk(); return a; } //其他增加项 public void kk() { System.out.println("找中介!"); }
方式二:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class text2 { public static void main(String[] args) { WQL56 a=new WQL56(new nv1()); Top as=(Top)a.Secceed(); as.secceed(); } } class WQL56{ private Object NV; public WQL56(Object NV) { this.NV = NV; } public Object Secceed(){ return Proxy.newProxyInstance(NV.getClass().getClassLoader(), NV.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { System.out.println("asdad"); Object a=method.invoke(NV,objects); return a; } }); } } interface Top{ public void secceed(); } class nv1 implements Top{ public void secceed(){ System.out.println("asd"); } }
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109