代理模式

靜態(tài)代理

public interface ISinger {
 2     void sing();
 3 }
 4 
 5 /**
 6  *  目標(biāo)對(duì)象實(shí)現(xiàn)了某一接口
 7  */
 8 public class Singer implements ISinger{
 9     public void sing(){
10         System.out.println("唱一首歌");
11     }  
12 }
13 
14 /**
15  *  代理對(duì)象和目標(biāo)對(duì)象實(shí)現(xiàn)相同的接口
16  */
17 public class SingerProxy implements ISinger{
18     // 接收目標(biāo)對(duì)象,以便調(diào)用sing方法
19     private ISinger target;
20     public UserDaoProxy(ISinger target){
21         this.target=target;
22     }
23     // 對(duì)目標(biāo)對(duì)象的sing方法進(jìn)行功能擴(kuò)展
24     public void sing() {
25         System.out.println("向觀眾問(wèn)好");
26         target.sing();
27         System.out.println("謝謝大家");
28     }
29 }

/**
 2  * 測(cè)試類(lèi)
 3  */
 4 public class Test {
 5     public static void main(String[] args) {
 6         //目標(biāo)對(duì)象
 7         ISinger target = new Singer();
 8         //代理對(duì)象
 9         ISinger proxy = new SingerProxy(target);
10         //執(zhí)行的是代理的方法
11         proxy.sing();
12     }
13 }

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

public interface ISinger {
 2     void sing();
 3 }
 4 
 5 /**
 6  *  目標(biāo)對(duì)象實(shí)現(xiàn)了某一接口
 7  */
 8 public class Singer implements ISinger{
 9     public void sing(){
10         System.out.println("唱一首歌");
11     }  
12 }

這回直接上測(cè)試,由于java底層封裝了實(shí)現(xiàn)細(xì)節(jié)(之后會(huì)詳細(xì)講),所以代碼非常簡(jiǎn)單,格式也基本上固定。

調(diào)用Proxy類(lèi)的靜態(tài)方法newProxyInstance即可,該方法會(huì)返回代理類(lèi)對(duì)象

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
接收的三個(gè)參數(shù)依次為:

ClassLoader loader:指定當(dāng)前目標(biāo)對(duì)象使用類(lèi)加載器,寫(xiě)法固定
Class<?>[] interfaces:目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類(lèi)型,寫(xiě)法固定
InvocationHandler h:事件處理接口,需傳入一個(gè)實(shí)現(xiàn)類(lèi),一般直接使用匿名內(nèi)部類(lèi)

public class Test{
 2     public static void main(String[] args) {
 3   Singer target = new Singer();
 4         ISinger proxy  = (ISinger) Proxy.newProxyInstance(
 5                 target.getClass().getClassLoader(),
 6                 target.getClass().getInterfaces(),
 7                 new InvocationHandler() {
 8                     @Override
 9                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
10                         System.out.println("向觀眾問(wèn)好");
11                         //執(zhí)行目標(biāo)對(duì)象方法
12                         Object returnValue = method.invoke(target, args);
13                         System.out.println("謝謝大家");
14                         return returnValue;
15                     }
16                 });
17         proxy.sing();
18     }
19 }
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 題記:一個(gè)偶然的原因看了木心的一些文章和詩(shī)句,覺(jué)得特別棒,摘抄幾句品味一下,亦是有趣的緊。標(biāo)題是打錯(cuò)了,本來(lái)想叫名...
    勇哥在進(jìn)化閱讀 620評(píng)論 2 0
  • 自己對(duì)悲觀的理解: 只是習(xí)慣于用最保守的態(tài)度去看待問(wèn)題,盡量把風(fēng)險(xiǎn)控制在可承受范圍內(nèi)…… 悲觀與內(nèi)心態(tài)度無(wú)關(guān),與毅...
    癡遇閱讀 218評(píng)論 0 2
  • 正值懷孕初期,看了董卿主持的《朗讀者》,由名模張梓琳朗讀的作家劉瑜寫(xiě)給女兒的那篇《愿你慢慢長(zhǎng)大》深深打動(dòng)了我。 文...
    悅己_蕾蕾閱讀 382評(píng)論 0 3
  • 納蘭玲瓏/文 梨花盛開(kāi)時(shí) 我路過(guò) 石庫(kù)門(mén)的樓下 一道道 拱形門(mén) 從一樓排到了 頂樓 波浪起伏 尖尖的屋頂 猶如教堂...
    納蘭玲瓏閱讀 409評(píng)論 9 14

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