代理模式定義:是指爲其他對象提供一種代理,以控制這個對象的訪問。使用代理模式的主要目的有兩個,其一是保護目標對象,其二是增強目標對象。
一、靜態代理
比現在社會上火熱的催婚問題,就可以用代理模式展示出來:
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 方法中傳入對應的單身人士的實例即可,而不限制於某一類客戶。從而達到了動態代理的目的。