自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java靜動(dòng)態(tài)代理模式示例

開(kāi)發(fā) 后端
靜態(tài)代理模式中,真實(shí)角色必須是事先已經(jīng)存在的,并將其作為代理對(duì)象的內(nèi)部屬性,并且真實(shí)角色必須對(duì)應(yīng)一個(gè)代理角色,如果大量使用會(huì)導(dǎo)致類的急劇膨脹。那么,如果事先并不知道真實(shí)角色,該如何使用代理呢?這個(gè)問(wèn)題可以通過(guò)Java的動(dòng)態(tài)代理類來(lái)解決。

設(shè)計(jì)模式
1.靜態(tài)代理模式
使用場(chǎng)合:

為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。在某些情況下,一個(gè)客戶不想或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。
涉及的角色:
抽象角色:
聲明真實(shí)對(duì)象和代理對(duì)象的共同接口;

代理角色:
代理對(duì)象角色內(nèi)部含有對(duì)真實(shí)對(duì)象的引用,從而可以操作真實(shí)對(duì)象,同時(shí)代理對(duì)象提供與真實(shí)對(duì)象相同的接口以便在任何時(shí)刻都能代替真實(shí)對(duì)象。同時(shí),代理對(duì)象可以在執(zhí)行真實(shí)對(duì)象操作時(shí),附加其他的操作,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝。

真實(shí)角色:
代理角色所代表的真實(shí)對(duì)象,是我們最終要引用的對(duì)象。
***的老師是代碼,下面是本人敲的一個(gè)靜態(tài)代理代碼示例 

Java代碼 收藏代碼

  1. package com;    
  2. /**   
  3.  * 車站接口-【抽象角色】   
  4.  *    
  5.  * @author abing   
  6.  *    
  7.  */    
  8. interface Station {    
  9.     void sellTicks();// 賣票    
  10.     void transport();// 運(yùn)輸乘客    
  11. }    
  12. /**   
  13.  * 火車站實(shí)現(xiàn)類-【具體角色】   
  14.  *    
  15.  * @author abing   
  16.  *    
  17.  */    
  18. class TrainStationImpl implements Station {    
  19.     @Override    
  20.     public void sellTicks() {    
  21.         System.out.println("TrainStation  sell tickets");    
  22.     }    
  23.     @Override    
  24.     public void transport() {    
  25.         System.out.println("TrainStation  transport passenger");       
  26.     }    
  27. }    
  28. /**   
  29.  * 該類做為火車站的一個(gè)代理直接供客戶端調(diào)用-【代理角色】   
  30.  *    
  31.  * @author abing   
  32.  *    
  33.  */    
  34. class StationProxy implements Station {    
  35.     Station sta = new TrainStationImpl();    
  36.     @Override    
  37.     public void sellTicks() {    
  38.         sta.sellTicks();//代理類中調(diào)用真實(shí)角色的方法。    
  39.     }    
  40.     public void otherOperate() {    
  41.         System.out.println("do some other things...");    
  42.     }    
  43.     @Override    
  44.     public void transport() {    
  45.         System.out.println("StationProxy can not transport");    
  46.     }    
  47. }    
  48. /**   
  49.  * 客戶端測(cè)試類   
  50.  *    
  51.  * @author abing   
  52.  *    
  53.  */    
  54. public class StaticProxyDemo {    
  55.     public static void main(String[] args) {    
  56.         Station station = new StationProxy();//客戶端直接操作代理類,避免了客戶端與真實(shí)類的直接交涉    
  57.         station.sellTicks();    
  58.     }    

#p#

2.動(dòng)態(tài)代理模式

靜態(tài)代理模式中,真實(shí)角色必須是事先已經(jīng)存在的,并將其作為代理對(duì)象的內(nèi)部屬性,并且真實(shí)角色必須對(duì)應(yīng)一個(gè)代理角色,如果大量使用會(huì)導(dǎo)致類的急劇膨脹。那么,如果事先并不知道真實(shí)角色,該如何使用代理呢?這個(gè)問(wèn)題可以通過(guò)Java的動(dòng)態(tài)代理類來(lái)解決。
動(dòng)態(tài)代理必需用到以下兩個(gè)類。
(1). Interface InvocationHandler:該接口中僅定義了一個(gè)方法Object:invoke(Object obj,Method method, Object[] args)。用于完成真實(shí)角色中方法的調(diào)用。(2).Proxy:該類即為動(dòng)態(tài)代理類,作用類似于靜態(tài)代理模式的代理類
***的老師是代碼,下面是本人敲的一個(gè)動(dòng)態(tài)代理代碼示例

Java代碼 收藏代碼

  1. package com.proxy;    
  2. import java.lang.reflect.InvocationHandler;    
  3. import java.lang.reflect.Method;    
  4. import java.lang.reflect.Proxy;    
  5. /**   
  6.  * 車站接口-【抽象角色】   
  7.  * @author abing   
  8.  *   
  9.  */    
  10. interface Station {    
  11.     void sellTicks();// 賣票    
  12. }    
  13. /**   
  14.  * 火車站實(shí)現(xiàn)類-【具體角色】   
  15.  * @author abing   
  16.  *   
  17.  */    
  18. class TrainStationImpl implements Station {    
  19.     @Override    
  20.     public void sellTicks() {    
  21.         System.out.println("TrainStation  sell tickets");    
  22.     }    
  23. }    
  24. /**   
  25.  * 使用動(dòng)態(tài)代理模式必須實(shí)現(xiàn)InvocationHandler接口,該接口中僅定義了一個(gè)方法:   
  26.  * invoke(Object obj,Method method, Object[] args)。   
  27.  * 在實(shí)際使用時(shí),***個(gè)參數(shù)obj一般是指代理類,method是被代理的方法,args為該方法的參數(shù)數(shù)組   
  28.  *    
  29.  * @author abing   
  30.  *   
  31.  */    
  32. class InvocationHandlerImpl implements InvocationHandler {    
  33.     Object proxyobj;    
  34.     public InvocationHandlerImpl(Object object) {    
  35.         this.proxyobj = object;    
  36.     }    
  37.     @Override    
  38.     public Object invoke(Object obj, Method method, Object[] args)    
  39.             throws Throwable {    
  40.         System.out.println("start doing  .........");    
  41.         method.invoke(proxyobj, args);//調(diào)用被代理對(duì)象proxyobj的方法method,傳入一個(gè)參數(shù)組args    
  42.         System.out.println("stop doing  .........");    
  43.         return null;    
  44.     }    
  45. }    
  46. /**   
  47.  * 客戶端測(cè)試類   
  48.  * @author abing   
  49.  *   
  50.  */    
  51. public class DynamicProxyDemo {    
  52.     public static void main(String[] args) {    
  53.         Station stationImpl = new TrainStationImpl();//將要被代理的真實(shí)對(duì)象    
  54.         /**   
  55.          * 動(dòng)態(tài)代理就好處在這里,不管這里是要代理什么對(duì)象,I   
  56.          * nvocationHandlerImpl與Proxy中代碼都不必改變,   
  57.          * 都是用下面同樣的方式去產(chǎn)生代理對(duì)象   
  58.          */    
  59.         InvocationHandler handler = new InvocationHandlerImpl(stationImpl);//用InvocationHandler的實(shí)現(xiàn)類包裝真實(shí)的被代理角色    
  60.         ClassLoader loader = handler.getClass().getClassLoader();//獲取當(dāng)期那java程序的類裝在器Classloadler    
  61.         Class<?>[] interfaces = stationImpl.getClass().getInterfaces();//獲取被代理角色實(shí)現(xiàn)的所有接口    
  62.         /**   
  63.          * Proxy類是動(dòng)態(tài)代理模式涉及到的另一個(gè)重要的類,該類即為動(dòng)態(tài)代理類,作用類似于靜態(tài)代理模式中的代理類StationProxy,   
  64.          * 它有一個(gè)重要方法tatic Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類的一個(gè)實(shí)例。   
  65.          * 其中l(wèi)oader是類裝載器,interfaces是真實(shí)類所擁有的全部接口的數(shù)組,傳遞此參數(shù)以使產(chǎn)生的代理對(duì)象可以當(dāng)做真實(shí)類任意實(shí)現(xiàn)接口的子類來(lái)用,   
  66.          * h是調(diào)用處理器InvocationHandler。    
  67.          */    
  68.         Station station = (Station) Proxy.newProxyInstance(loader, interfaces,handler);    
  69.         station.sellTicks();//將會(huì)去執(zhí)行DynamicProxy的invoke方法,完成對(duì)目標(biāo)對(duì)象方法的調(diào)用    
  70.     }    

原文鏈接:http://kuru.iteye.com/blog/1261562

編輯推薦:

  1. 紅帽云中Java提供綜合生命周期支持
  2. 純Java進(jìn)程內(nèi)緩存框架Ehcache 2.5正式發(fā)布
  3. 深入淺出Rhino:Java與JS互操作
  4. JavaScript異步編程之Jscex無(wú)創(chuàng)痕切入jQueryUI
  5. Java開(kāi)發(fā)框架Play框架快速入門
責(zé)任編輯:林師授 來(lái)源: kuru的博客
相關(guān)推薦

2011-04-06 11:41:25

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

2023-02-24 07:42:30

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

2011-03-23 10:40:51

java代理模式

2012-08-28 10:59:26

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

2017-10-12 14:56:11

2015-09-22 11:09:47

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

2023-12-06 08:23:44

代理模式設(shè)計(jì)模式

2021-07-06 06:39:22

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

2015-09-28 15:59:00

Java動(dòng)態(tài)代理機(jī)制

2017-05-11 21:30:01

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

2021-09-08 07:18:30

代理模式對(duì)象

2015-09-24 08:54:36

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

2015-09-24 08:55:14

Java動(dòng)態(tài)代理擴(kuò)展

2012-02-29 09:41:14

JavaScript

2012-01-13 15:59:07

2021-06-29 08:54:23

設(shè)計(jì)模式代理模式遠(yuǎn)程代理

2010-04-21 09:26:54

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

2012-02-08 10:12:19

Java反射

2020-04-27 07:28:00

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

2020-12-28 07:47:35

動(dòng)態(tài)代理AOP
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)