簡介
生活中或多代理(中介也算).市面上的鏈家、中原網等。客戶直接面向的是代理,無需跟目標老闆交涉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(); } }