Proxy模式——動態(tài)代理

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)代理是則是我們自己編寫好類

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容