Proxy Pattern 代理模式

代理模式定義:是指爲其他對象提供一種代理,以控制這個對象的訪問。使用代理模式的主要目的有兩個,其一是保護目標對象,其二是增強目標對象。

一、靜態代理

比現在社會上火熱的催婚問題,就可以用代理模式展示出來:

1、定義一個人類接口,內含一個尋找真愛的行爲。

public interface Person{
    public void findLove();
}

2、孩子要找對象,實現Person接口

public class Son implements Person{
    @Voerride
    public void findLove(){
        System.out.println("尋找真愛");
    }
}

3、父親要幫孩子相親,創建Father 類:

public class Father{
    private Son son;
    public Father(Son son){
        this.son = son;
    }

    public void findLove(){
        System.out.println("尋找相親對象");
        this.son.findLove();
        System.out.println("相互看對眼了,並同意交往。");
    }
}

4、測試

public static void main(String args[]){
    // 只能幫自己的孩子物色對象
    Father father = new Father(new Son);
    father.findLove();
}

5、執行結果如下:

尋找相親對象
尋找真愛
相互看對眼了,並同意交往。

以上就是父親作爲孩子找對象的代理,可以回顧並理解下代理模式。

二、動態代理

動態代理和靜態代理思路一致,不過動態代理更爲強大。由上面的例子可以看出,父親這個代理只能爲兒子尋找對象而不能爲其他人尋找,如果想使用靜態代理爲其他人尋找對象的話,成本相對較高。這時候就需要婚介所登臺以滿足任何人的需求,動態代理就是這麼實現的:

1、創建媒婆類,並實現 InvocationHandler 接口:

// 創建媒婆類 並實現InvocationHandler 接口
public class Meipo implements InvocationHandler{

    // 被代理的對象,把引用保存下來
    private Object target;
    public Object getInstance(Object target) throws Exception{
        this.target = target;

        Class<?> clazz = target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInstance(),this);
    }

    public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {
        before();
        method.invoke(this.target,args);
        after();
        return proxy;
    }

    private void before(){
        System.out.println("我是媒婆,根據你的需求,開始幫你物色對象。");
    }

    private void after(){
        System.out.printn("合適就可以舉行婚禮了。");
    }
}

2、創建單身客戶類:

public class Customer implements Person{
    public void findLove(){
        System.out.println("膚白貌美大長腿。");
    }
}

3、測試如下:

public static void main(String[] args) {
    Person obj = new Meipo().getInstance(new Customer());
    obj.findLove();
}

4、執行結果如下:

我是媒婆,根據你的需求,開始幫你物色對象。
膚白貌美大長腿。
合適就可以舉行婚禮了。

由此我們可以看出來,如果需要給另一個單身人士介紹對象的話,只需要在getInstance 方法中傳入對應的單身人士的實例即可,而不限制於某一類客戶。從而達到了動態代理的目的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章