Java設(shè)計模式—代理模式

代理模式定義:對其他對象提供一種代理以控制對這個對象的訪問。

  • 代理模式的主要作用
    為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用。
  • 代理模式的思想
    為了提供額外的處理或者不同的操作而在實(shí)際對象與調(diào)用者之間插入一個代理對象。這些額外的操作通常需要與實(shí)際對象進(jìn)行通信。

現(xiàn)實(shí)生活中也有很類似的情形。比如打官司需要請律師,買房子需要找中介等等。
以買車為例,如果我們要買一輛轎車必須通過汽車4S店,汽車4s店就是充當(dāng)代理角色,其目的就是控制買車客戶的買車行為,必須通過汽車4S店才能從汽車廠商買一輛車。

靜態(tài)代理

  1. 首先新建一個買車的接口
public interface IBuyCar {
    //買車
    void buyCar();
}
  1. 聲明一個要買車的客戶,實(shí)現(xiàn)買車接口
public class Customer implements IBuyCar {

    private int cash;//購車款

    public int getCash() {
        return cash;
    }

    public void setCash(int cash) {
        this.cash = cash;
    }

    @Override
    public void buyCar() {
        Log.e("buyCar", "買一輛車花費(fèi)了-->" + cash + "元");
    }
}
  1. 聲明一個買車代理汽車4S店,同樣也實(shí)現(xiàn)買車接口,必須接受客戶下單
public class BuyCarProxy implements IBuyCar{
    private Customer customer;//接收買車客戶

    public BuyCarProxy(Customer customer){
        this.customer=customer;//接收買車客戶
    }

    @Override
    public void buyCar() {//實(shí)現(xiàn)為客戶買車
        customer.buyCar();
    }
}
  1. 創(chuàng)建一個客戶端,模擬一次買車
Customer customer=new Customer();
customer.setCash(120000);
BuyCarProxy buyCarProxy=new BuyCarProxy(customer);
buyCarProxy.buyCar();

動態(tài)代理

以上講的都是代理模式的靜態(tài)實(shí)現(xiàn),所謂靜態(tài)代理就是自己要為要代理的類寫一個代理類,或者用工具為其生成的代理類,總之,就是程序運(yùn)行前就已經(jīng)存在的編譯好的代理類,這樣有時候會覺得非常麻煩,也導(dǎo)致非常的不靈活,相比靜態(tài)代理,動態(tài)代理具有更強(qiáng)的靈活性,因?yàn)樗挥迷谖覀冊O(shè)計實(shí)現(xiàn)的時候就指定某一個代理類來代理哪一個被代理對象,我們可以把這種指定延遲到程序運(yùn)行時由JVM來實(shí)現(xiàn)。

  1. 首先我們要聲明一個動態(tài)代理類,實(shí)現(xiàn)InvocationHandler接口
public class DynamicProxy implements InvocationHandler {

    // 被代理類的實(shí)例
    Object obj;

    // 將被代理者的實(shí)例傳進(jìn)動態(tài)代理類的構(gòu)造函數(shù)中
    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    /**
     * 覆蓋InvocationHandler接口中的invoke()方法
     * 更重要的是,動態(tài)代理模式可以使得我們在不改變原來已有的代碼結(jié)構(gòu)
     * 的情況下,對原來的“真實(shí)方法”進(jìn)行擴(kuò)展、增強(qiáng)其功能,并且可以達(dá)到
     * 控制被代理對象的行為,下面的before、after就是我們可以進(jìn)行特殊
     * 代碼切入的擴(kuò)展點(diǎn)了。
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        /*
         * before :doSomething();
         */
        Object result = method.invoke(this.obj, args);

        /*
         * after : doSomething();
         */
        return result;
    }
}
  1. 具體實(shí)現(xiàn)
//我們要代理的真實(shí)對象
        Customer customer = new Customer();
        //我們要代理哪個真實(shí)對象,就將該對象傳進(jìn)去,最后是通過該真實(shí)對象來調(diào)用其方法的
        InvocationHandler handler = new DynamicProxy(customer);

        /*
         * 通過Proxy的newProxyInstance方法來創(chuàng)建我們的代理對象,我們來看看其三個參數(shù)
         * 第一個參數(shù) handler.getClass().getClassLoader() ,我們這里使用handler這個類的
         * ClassLoader對象來加載我們的代理對象
         * 第二個參數(shù)customer.getClass().getInterfaces(),我們這里為代理對象提供的接口是
         * 真實(shí)對象所實(shí)行的接口,表示我要代理的是該真實(shí)對象,這樣我就能調(diào)用這組接口中的方法了
         * 第三個參數(shù)handler, 我們這里將這個代理對象關(guān)聯(lián)到了上方的 InvocationHandler 這個對象上
         */
        IBuyCar buyCar = (IBuyCar) Proxy.newProxyInstance(handler.getClass().getClassLoader(),  
 customer.getClass().getInterfaces(), handler);
        buyCar.buyCar();
  1. 動態(tài)代理好處
  • 減少編程的工作量:假如需要實(shí)現(xiàn)多種代理處理邏輯,只要寫多個代理處理器就可以了,無需每種方式都寫一個代理類。
  • 系統(tǒng)擴(kuò)展性和維護(hù)性增強(qiáng),程序修改起來也方便多了(一般只要改代理處理器類就行了)。

原文出處Java設(shè)計模式之代理模式(Proxy)

最后編輯于
?著作權(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)容

  • 定義 代理模式是對象的結(jié)構(gòu)模式。代理模式給某一個對象提供代理對象,并由代理對象控制對源對象的引用。 代理模式的結(jié)構(gòu)...
    步積閱讀 6,604評論 0 1
  • 李先生, 今天看你去重慶了 玩得開心嗎 我是不是也應(yīng)該緊跟你的腳步了 很熱...
    L離城閱讀 187評論 0 0
  • 下著雨,時間也不早了,我在上班的路上。經(jīng)過早市,快要到龍烹店時,我發(fā)現(xiàn)了阿姨。 “阿姨!” “噯!你還去上班,沒放...
    柚稚媽媽閱讀 2,618評論 7 78
  • 我對你說吧,要是河水干了,我會用眼淚把它灌滿;要是風(fēng)勢低了,我會用嘆息把船只吹送。 來吧,來吧;主人派我來叫你的。...
    孫追光閱讀 449評論 3 0
  • 內(nèi)向外向沒關(guān)系 關(guān)鍵是你對自己和他人的評價 內(nèi)向的人不一定不討人喜歡 外向的人不一定大家都喜歡你 你有自己的主見 ...
    阿譯閱讀 243評論 0 0

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