代理模式

1.代理設(shè)計(jì)模式介紹

1.1 模式定義

為其他對(duì)象提供一種代理,以控制對(duì)這個(gè)對(duì)象的訪問,分為靜態(tài)代理和動(dòng)態(tài)代理。說到代理我們其實(shí)都明白,日常的生活中也并不少見,比如每天吃飯趕進(jìn)度,我們需要叫人給我們帶飯;我們?nèi)ャy行辦張卡,有銀行的業(yè)務(wù)員幫我們辦卡等等,編程的思想其實(shí)有的時(shí)候和生活差不多。

1.2 代理模式的簡單事例

設(shè)計(jì)模式是一種思想,經(jīng)常在講定義的時(shí)候的確又很枯燥,但是無論哪一門語言我們又必須都得學(xué),如 iOS,Android,Unity3D 都離不開這些。既然是個(gè)簡單的事例,我們就以這個(gè)銀行辦卡來說吧:

/**
 * description: 靜態(tài)代理設(shè)計(jì)模式 - 目標(biāo)接口
 */
public interface IBank {
    void applyBank();
}
/**
 * description: 靜態(tài)代理設(shè)計(jì)模式 - 被代理對(duì)象
 */
public class Man implements IBank{
    @Override
    public void applyBank() {
        System.out.println("辦卡");
    }
}
/**
 * description: 靜態(tài)代理設(shè)計(jì)模式 - 代理對(duì)象
 */
public class BankSalesman implements IBank{
    private IBank bank;

    public BankSalesman(IBank bank){
        this.bank = bank;
    }

    @Override
    public void applyBank() {
        System.out.println("數(shù)據(jù)統(tǒng)計(jì)");
        bank.applyBank();
        System.out.println("完畢");
    }
}
/**
 * description:代理設(shè)計(jì)模式 - 測(cè)試
 */
public class Client {
    public static void main(String[] args){
        Man man = new Man();
        BankSalesman salesman = new BankSalesman(man);
        salesman.applyBank();
    }
}

這就是我們的靜態(tài)代理設(shè)計(jì)模式,運(yùn)行結(jié)果很簡單這里就不給出了,其實(shí)代理設(shè)計(jì)模式也很簡單,其主要還是一種委托機(jī)制,真實(shí)對(duì)象將方法委托給代理對(duì)象,所以這里設(shè)計(jì)模式又有另一種說法,又叫委托模式,相信我們都不難理解。但是這里我們又要拋出一個(gè)問題,比如我現(xiàn)在要新增一個(gè)掛失我又得怎么寫呢?這里我就不寫了,接下來我們看下動(dòng)態(tài)代理模式。

1.3 動(dòng)態(tài)代理

與靜態(tài)代理不同的是,動(dòng)態(tài)代理通過反射在運(yùn)行時(shí)生成代理對(duì)象,Java也已經(jīng)給我們提供了一個(gè)便捷的動(dòng)態(tài)代理接口 InvocationHandler,源碼最終調(diào)用的是 Native 方法去生成我們的代理對(duì)象,其實(shí)在內(nèi)涵段子項(xiàng)目中,已經(jīng)帶大家看過動(dòng)態(tài)代理的源碼了。這里就不做太多介紹,看下上面的事例采用動(dòng)態(tài)代理,又有怎樣的改變:

/**
 * description: 動(dòng)態(tài)代理設(shè)計(jì)模式 - InvocationHandler
 */
public class DynamicBankProxy implements InvocationHandler{
    private Object object;

    public DynamicBankProxy(Object object){
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("數(shù)據(jù)統(tǒng)計(jì)");
        Object result = method.invoke(object,args);
        System.out.println("完畢");
        return result;
    }
}
**
 * description:代理設(shè)計(jì)模式 - 測(cè)試
 */
public class Client {
    public static void main(String[] args) {
        Man man = new Man();
        IBank bank = (IBank) Proxy.newProxyInstance(IBank.class.getClassLoader(),
                new Class<?>[]{IBank.class}, new DynamicBankProxy(man));
        bank.applyBank();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1 代理模式的定義 代理模式:代理模式又叫委托模式,是為某個(gè)對(duì)象提供一個(gè)代理對(duì)象,并且由代理對(duì)象控制對(duì)原對(duì)象的訪問...
    Jerry_1116閱讀 20,812評(píng)論 3 10
  • 前言 Android的設(shè)計(jì)模式系列文章介紹,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 12,175評(píng)論 1 26
  • 我是游戲至尊 2007年,感覺很無聊,于是就玩了一段時(shí)間的網(wǎng)絡(luò)游戲,游戲名就不說了,要不就有做廣告的嫌疑,反正就是...
    WILL_HUNTING閱讀 538評(píng)論 0 0
  • 游戲 書中用游戲來引入代理模式,游戲大家都玩過,基本套路就是打怪升級(jí),我們把這段打游戲的過程系統(tǒng)化,非常簡單的一個(gè)...
    stayiwithime閱讀 1,030評(píng)論 0 0
  • 原作者:frank909原博客鏈接:輕松學(xué),Java 中的代理模式及動(dòng)態(tài)代理 前幾天我寫了《秒懂,Java 注解 ...
    駭客與畫家閱讀 447評(píng)論 0 1

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