简介
生活中或多代理(中介也算).市面上的链家、中原网等。客户直接面向的是代理,无需跟目标老板交涉java
代理模式也是如此,简单讲代理模式分静态、动态两种ide
静态代理
先画个UML关系图.这个能更直观的表达函数
package com.fumeck.general; public class Client { public void excute(){ System.out.println("客户:我须要租房子"); } }
package com.fumeck.general; public class ProxyMan { private Client client; public ProxyMan(Client client) { this.client = client; } public void excute(){ System.out.println("代理人:你好我来了"); client.excute(); System.out.println("代理人:OK,包在我身上"); } }
package com.fumeck.general; public class Demo { public static void main(String[] args) { Client client = new Client(); ProxyMan proxyMan = new ProxyMan(client); proxyMan.excute(); } }
控制台输出:this
代理人:你好我来了
客户:我须要租房子
代理人:OK,包在我身上spa
优势:采用了聚合的方式。经过构建函数建立代理对象时传入客户对象便可代理
确实:灵活性不够,若是代理十个事件就得写是个方法code
动态代理
动态代理又分为两种:对象
1.基于接口的Jdk动态代理
jdk就自带动态代理。位于java.lang.reflect的包下,这样就不难理解.动态代理就是运用反射的原理来实现的,若是对Java反射的没有必定的基础,建议先学一学接口
InvocationHandler接口是核心接口。他只有一个方法invoke(Object object,Method method,Object[] args)事件
public interface SubjectI { void excute(); }
public class Client implements SubjectI{ @Override public void excute() { System.out.println("我要找房子"); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ProxyMan implements InvocationHandler{ private SubjectI subjectI; public ProxyMan(SubjectI subjectI) { this.subjectI = subjectI; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("尼玛"); Object o = method.invoke(subjectI,args); System.out.println("你妹"); return o; } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Demo { public static void main(String[] args) throws Throwable { Demo demo =new Demo(); InvocationHandler s=new ProxyMan(new Client()); SubjectI proxy = (SubjectI) Proxy.newProxyInstance(demo.getClass().getClassLoader(),new Class[]{SubjectI.class},s); proxy.excute(); } }