java設(shè)計模式
靜態(tài)代理 :一個RealSubject類對應(yīng)一個Proxy類
如果有多個RealSubject,該怎么辦吶?
動態(tài)代理
1.創(chuàng)建抽象類
public interface Subject {
void eat() throws Exception;//抽象主題
}
2.創(chuàng)建真實類RealSubject——被代理的類
import java.util.Random;
public class Pig implements Subject{
//RealSubject真實主題
@Override
public void eat() throws Exception {
Thread.sleep(new Random().nextInt(1000));
System.out.println("豬正在吃飯中......");
}
}
3.創(chuàng)建事務(wù)處理器
InvocationHandler接口
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
參數(shù):
proxy 被代理的對象(真實對象RealSubject)
method 被代理對象的方法(所哦調(diào)用真實對象的某個方法的Method對象)
args 方法的參數(shù)(調(diào)用真實對象某個方法時接受的參數(shù))
返回:
Object 方法返回值
具體實現(xiàn)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TimeHandler implements InvocationHandler{
private Object object;//綁定委托對象,即具體實現(xiàn)類的實例化對象
public TimeHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long startTime = System.currentTimeMillis();
System.out.println("豬開始吃飯…");
method.invoke(object, args);
long stopTime = System.currentTimeMillis();
System.out.println("豬結(jié)束吃飯");
System.out.println("豬的吃飯時間:" + (stopTime - startTime) + "毫秒!");
return null;
}
}
4.測試類
Proxy類——動態(tài)創(chuàng)建一個代理對象的類
public class Proxy implements java.io.Serializable {
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h) {
//這個方法的作用:得到一個動態(tài)的代理對象
......
}
}
loader 類加載器:定義了由哪個ClassLoader對象來對生成的代理對象加載
interfaces 實現(xiàn)接口:Intrface對象數(shù)組,表示的是將要給代理的對象提供一組什么接口,如果我提供了一組接口,它就實現(xiàn)該接口——就能調(diào)用該接口的方法
h InvocationHandler:表示的是當(dāng)動態(tài)代理對象在調(diào)用方法時,會關(guān)聯(lián)到哪個InvocationHandler對象上
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) throws Exception {
Pig pig = new Pig();
InvocationHandler handler = new TimeHandler(pig);
Class<?> cls = pig.getClass();
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),handler);
subject.eat();
}
}
5.運(yùn)行結(jié)果

Main.png
動態(tài)代理&靜態(tài)代理 :動態(tài)代理不需要我們?nèi)ゾ帉懘眍?,在程序中動態(tài)生成,而靜態(tài)代理是則是我們自己編寫好類