例解代理模式

??代理模式提供了對對象的另外一種訪問方式,即通過代理對象訪問目標(biāo)對象。當(dāng)不能或不想直接訪問目標(biāo)對象時(shí),就可以使用代理模式。代理模式實(shí)現(xiàn)的關(guān)鍵是代理對象與目標(biāo)對象。代理對象是對目標(biāo)對象的擴(kuò)展,并且會調(diào)用目標(biāo)對象。

1.靜態(tài)代理

靜態(tài)代理需要目標(biāo)對象和代理對象實(shí)現(xiàn)相同的接口或者相同的父類

示例:

//目標(biāo)接口
package proxy;

public interface IAnimalDao {
   public void run();
}

//目標(biāo)類
package proxy;
public class DogDao implements IAnimalDao{

@Override
public void run() {
     // TODO Auto-generated method stub
     System.out.println("dog run......");
  }

}

//代理類
package proxy;
public class ProxyDao implements IAnimalDao{ 
   private IAnimalDao target;
   public ProxyDao(IAnimalDao target) {
    this.target=target;
}
   @Override
   public void run() {
       // TODO Auto-generated method stub
       System.out.println("開始事務(wù)");
       //
       target.run();
       System.out.println("提交事務(wù)");
   }

}

//測試類
package proxy;
public class StaticProxyDemo {
   public static void main(String args[]) {
      DogDao dogDao=new DogDao();
      IAnimalDao proxy=new ProxyDao(dogDao);
      proxy.run();
  }
}

輸出:

開始事務(wù)
dog run......
提交事務(wù)

總結(jié):靜態(tài)代理需要代理對象也實(shí)現(xiàn)和目標(biāo)對象相同的接口,當(dāng)目標(biāo)對象修改時(shí),需要同時(shí)維護(hù)代理對象

2.動態(tài)代理

動態(tài)代理不需要實(shí)現(xiàn)和目標(biāo)對象一樣的接口。jdk中提供了api用于構(gòu)建代理對象

示例:

//目標(biāo)接口
package proxy;
public interface IAnimalDao {
   public void run();
}

//目標(biāo)對象
package proxy;
public class DogDao implements IAnimalDao{
   @Override
   public void run() {
     // TODO Auto-generated method stub
     System.out.println("dog run......");
   }
}

//產(chǎn)生代理類實(shí)例
package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DogProxy {
   private Object target;
   public DogProxy(Object target) {
     this.target=target;
   }
   public Object getProxyInstance() {
       return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {
        
         @Override
         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub
            System.out.println("開始事務(wù)");
            Object value=method.invoke(target, args);
            System.out.println("提交事務(wù)");
            return value;
        }
      });
   }
}

//測試類
package proxy;

public class DynamicProxyDemo {
   public static void main(String args[]) {
     IAnimalDao target=new DogDao();
     IAnimalDao proxy=(IAnimalDao) new DogProxy(target).getProxyInstance();
     proxy.run();
   }
}

輸出:

開始事務(wù)
dog run......
提交事務(wù)

總結(jié):代理對象不需要實(shí)現(xiàn)接口,但目標(biāo)對象一定要實(shí)現(xiàn)接口,不然不能使用jdk動態(tài)代理

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,694評論 19 139
  • 1 場景問題# 1.1 訪問多條數(shù)據(jù)## 考慮這樣一個(gè)實(shí)際應(yīng)用:要一次性訪問多條數(shù)據(jù)。 這個(gè)功能的背景是這樣的;在...
    七寸知架構(gòu)閱讀 3,145評論 1 52
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,834評論 18 399
  • *by喃七月 抱歉作者真的是花盲 認(rèn)不出來 覺得很適合學(xué)習(xí)就練習(xí)課 和大家一起分享*第一步:針管筆直接起稿,棒棒噠...
    喃七月閱讀 1,274評論 0 5
  • 釋迦摩尼去世以百年,佛教開始分化,主要原因是佛教中有很多沒有說清楚的理論讓大家產(chǎn)生了分歧;畢竟一個(gè)人的智慧是難以和...
    sonetlys閱讀 1,046評論 1 4

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