亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java設計模式筆記之代理模式

2024-07-13 10:13:10
字體:
來源:轉載
供稿:網友

代理(Proxy)模式:

代理模式是對象的結構模式。代理模式給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。

核心作用:

通過代理,控制對對象的訪問。

可以詳細控制訪問某個(某類)對象的方法,在調用這個方法之前做前置處理,在調用這個方法之后做后置處理。即AOP的微觀實現。

AOP(Aspect Oriented Programming面向切面編程)的核心實現機制。

生活中的場景:

  所謂代理,就是一個人或者機構代表另一個人或者機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
  例如,客戶要找某個明星唱歌,首先需要找到他的經紀人,然后由他的經紀人來安排某明星唱歌。
  經紀人在演唱會舉辦前需要處理一些前置處理(面談,合同起草,簽字,收預付款,安排機票和車輛等)在演唱會舉辦后需要處理一些后置處理(收尾款等)。此時某明星(真實角色)只需要關心如何唱歌就可以了,其他事情全部交給經紀人(代理)來辦。

核心角色:

這里寫圖片描述

抽象對象角色:聲明了代理對象和真實對象的共同接口,定義代理對象和真實對象的公共對外方法。這樣一來在任何可以使用真實對象的地方都可以使用代理對象。

真實對象角色:定義了代理對象所代表的真實對象。實現抽象對象,定義真實對象所需要實現的業務邏輯,供代理對象調用。關注真正的業務邏輯。

代理對象角色:實現抽象對象,是真實對象的代理,通過真實對象的業務邏輯方法來實現抽象方法,并附加自己的操作。將統一的流程控制放到代理對象中處理。

  代理對象內部含有真實對象的引用,從而可以在任何時候操作真實對象;代理對象提供一個與真實對象相同的接口,以便可以在任何時候替代真實對象。代理對象通常在客戶端調用傳遞給真實對象之前或之后,執行某個操作,而不是單純地將調用傳遞給真實對象。

應用場景:

安全代理:屏蔽對真實角色的直接訪問。
遠程代理:通過代理類處理遠程方法調用。
延遲加載:先加載輕量級的代理對象,真正需要再去加載真實對象。(圖片的延遲加載)

分類:

靜態代理:(靜態定義代理類)

上面例子的代碼:

1、聲明了代理對象和真實對象的共同接口,定義代理對象和真實對象的公共對外方法。

public interface Star {  /**   * 面談   */  void confer();  /**   * 簽合同   */  void signContract();  /**   * 訂票   */  void bookTicket();  /**   * 唱歌   */  void sing();  /**   * 收錢   */  void collectMoney();}

2、定義一個真實對象的類,實現抽象接口所提供的方法。

public class RealStar implements Star {  @Override  public void bookTicket() {    System.out.println("RealStar.bookTicket()");  }  @Override  public void collectMoney() {    System.out.println("RealStar.collectMoney()");  }  @Override  public void confer() {    System.out.println("RealStar.confer()");  }  @Override  public void signContract() {    System.out.println("RealStar.signContract()");  }  @Override  public void sing() {    System.out.println("RealStar.sing()");  }}

3、定義一個代理對象的類,實現抽象接口所提供的方法,并持有真實對象的引用。

 

public class ProxyStar implements Star{private Star star;  public ProxyStar(Star star) {    super();    this.star = star;  }  @Override  public void bookTicket() {    System.out.println("ProxyStar.bookTicket()");  }  @Override  public void collectMoney() {    System.out.println("ProxyStar.collectMoney()");  }  @Override  public void confer() {    System.out.println("ProxyStar.confer()");  }  @Override  public void signContract() {    System.out.println("ProxyStar.signContract()");  }  @Override  public void sing() {    star.sing();  }}

4.測試類

public class Client {  public static void main(String[] args) {    //定義真實對象角色    Star realStar = new RealStar();    //定義代理對象角色,內部含有真實對象的引用    Star proxyStar = new ProxyStar(realStar);    proxyStar.confer();    proxyStar.signContract();    proxyStar.bookTicket();    proxyStar.sing();    proxyStar.collectMoney();  }}

運行結果如下:

ProxyStar.confer()ProxyStar.signContract()ProxyStar.bookTicket()RealStar.sing()ProxyStar.collectMoney()

  從上面的例子可以看出代理對象將客戶端的調用委派給真實對象,在調用目標對象的方法之前跟之后都可以執行特定的操作。   

動態代理:(動態生成代理類):

動態代理相比于靜態代理的優點:

  抽象角色中(接口)聲明的所有方法都被轉移到調用服務器的一個集中的方法中處理,這樣我們可以更加靈活和統一的處理眾多的方法。   

JDK自帶的動態代理

java.lang.reflect.Proxy
動態生成代理類和對象

java.lang.reflect.InvocationHandler(處理器接口)
可以通過invoke方法實現對真實角色的代理訪問

每次通過Proxy生成代理類對象時都要指定對應的處理器對象

測試代碼如下:

1、聲明了代理對象和真實對象的共同接口,定義代理對象和真實對象的公共對外方法。

public interface Star {  /**   * 面談   */  void confer();  /**   * 簽合同   */  void signContract();  /**   * 訂票   */  void bookTicket();  /**   * 唱歌   */  void sing();  /**   * 收錢   */  void collectMoney();}

2、定義一個真實對象的類,實現抽象接口所提供的方法。

public class RealStar implements Star {  @Override  public void bookTicket() {    System.out.println("RealStar.bookTicket()");  }  @Override  public void collectMoney() {    System.out.println("RealStar.collectMoney()");  }  @Override  public void confer() {    System.out.println("RealStar.confer()");  }  @Override  public void signContract() {    System.out.println("RealStar.signContract()");  }  @Override  public void sing() {    System.out.println("RealStar.sing()");  }}

3.定義一個StarHandler類實現InvocationHandler處理器接口,可以通過invoke方法實現對真實角色的代理訪問,也可在invoke方法中對眾多操作做統一的處理。

 

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class StarHandler implements InvocationHandler{  private Star realStar;  public StarHandler(Star realStar) {    super();    this.realStar = realStar;  }  @Override  public Object invoke(Object proxy, Method method, Object[] args)      throws Throwable {    //返回值    Object object = null;    System.out.println("真正的方法執行前!");    System.out.println("面談,簽合同,預付款,訂機票");    if(method.getName().equals("sing")){      object = method.invoke(realStar, args);    }    System.out.println("真正的方法執行后!");    System.out.println("收尾款");    return object;  }}

4.客戶端測試類

import java.lang.reflect.Proxy;public class Client {public static void main(String[] args) {    Star realStar = new RealStar();    StarHandler handler = new StarHandler(realStar);    //通過Proxy生成代理類對象并指定對應的處理器對象    Star proxyStar = (Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),         new Class[]{Star.class}, handler);    proxyStar.sing();  }

運行結果如下:

真正的方法執行前!
面談,簽合同,預付款,訂機票
RealStar.sing()
真正的方法執行后!
收尾款

開發框架中的應用場景

代理模式在開發框架中的應用場景是非常多的,實際上隨便選擇一個開發框架都有用到代理模式。例如:

mybatis中實現攔截器插件
AspectJ的實現
spring中AOP的實現

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩在线一区| 国产综合色香蕉精品| 国产成人精品视频| 亚洲人成五月天| 欧美性高潮在线| 欧美日韩精品在线播放| 国产网站欧美日韩免费精品在线观看| 91中文字幕在线| 日韩精品视频免费专区在线播放| 国产精品高潮呻吟久久av黑人| 国产精品欧美日韩久久| 日本91av在线播放| 久久国产精品偷| 国产欧美一区二区三区在线看| 久久久久久久久国产精品| 欧美性猛交xxxx乱大交极品| 国产精品v片在线观看不卡| 中文字幕一区二区三区电影| 亚洲91精品在线观看| 亚洲女在线观看| 国产精品精品国产| 国产日韩视频在线观看| 精品久久香蕉国产线看观看gif| 日韩欧亚中文在线| 国产精品专区第二| 久热精品视频在线| 永久免费精品影视网站| 久久精品99久久久久久久久| 国产精品视频永久免费播放| 91国产在线精品| 日韩在线视频线视频免费网站| 国产精品久久久久高潮| 国产精品久久久久久网站| 亚洲综合精品伊人久久| 色婷婷综合成人av| 国产精品国产三级国产专播精品人| 国产精品美女www| 日韩av中文在线| 中文字幕精品视频| 永久免费看mv网站入口亚洲| 亚洲第一精品自拍| 亚洲自拍小视频免费观看| 国产成人精品免费久久久久| 日韩在线精品一区| 午夜精品三级视频福利| 国内精品一区二区三区| 91精品91久久久久久| 久久人91精品久久久久久不卡| 欧美亚洲在线视频| 日本高清不卡的在线| 精品视频偷偷看在线观看| 国产精品女人久久久久久| 国产精品看片资源| 欧美一级免费视频| 亚洲一区二区三区在线视频| 亚洲黄色有码视频| 久久久免费高清电视剧观看| 久久综合久中文字幕青草| 亚洲人午夜精品免费| 青草成人免费视频| 国产精品偷伦一区二区| 欧美日韩色婷婷| 欧美一二三视频| 久久久久久久久久久久久久久久久久av| 中文字幕亚洲一区二区三区五十路| 最近2019中文字幕大全第二页| 日本韩国在线不卡| 亚洲新声在线观看| 亚洲第一福利视频| 国产亚洲美女久久| 久久这里只有精品视频首页| 性欧美办公室18xxxxhd| 欧美中文字幕第一页| 成人乱色短篇合集| 欧美激情精品久久久久久黑人| 欧美日韩激情小视频| 久久噜噜噜精品国产亚洲综合| 国产成人免费av| 欧美日韩一二三四五区| 国产自摸综合网| 日韩中文av在线| 欲色天天网综合久久| 狠狠久久五月精品中文字幕| 国产精品专区第二| 亚洲欧洲高清在线| 欧美成人三级视频网站| 亚洲а∨天堂久久精品9966| 成人免费看片视频| 国产精品视频午夜| 国产亚洲欧洲高清| 91国内揄拍国内精品对白| 97av在线播放| 日韩av高清不卡| 性欧美暴力猛交69hd| 国产精品三级美女白浆呻吟| 红桃av永久久久| 欧美亚洲日本黄色| 久久成人综合视频| 国产精品自拍网| 免费av一区二区| 日韩精品中文在线观看| 日韩av高清不卡| 久久男人资源视频| 在线国产精品视频| 国产精品国产自产拍高清av水多| 午夜精品一区二区三区在线视频| 中文字幕欧美日韩精品| 久久99久国产精品黄毛片入口| 午夜精品久久久久久久白皮肤| 亚洲石原莉奈一区二区在线观看| 亚洲欧美在线x视频| 亚洲精品国精品久久99热一| 欧美日韩美女在线观看| 中国china体内裑精亚洲片| 成人免费淫片aa视频免费| 亚洲国产精品999| 丝袜情趣国产精品| 亚洲黄色在线观看| 亚洲精品久久久久久久久久久久| 91成人精品网站| 国产精品久久久久久久久免费看| 91在线|亚洲| 成人免费高清完整版在线观看| 成人www视频在线观看| 亚洲a成v人在线观看| 中文字幕av日韩| 国产精品久久久久91| 欧美又大粗又爽又黄大片视频| 欧美精品在线视频观看| 国语自产在线不卡| 日韩免费在线看| 久久久久999| 色悠悠久久久久| 久久影视免费观看| 久久久久亚洲精品成人网小说| 欧美日韩美女在线观看| 日韩久久精品成人| 亚洲欧洲激情在线| 亚洲精品综合精品自拍| 国产亚洲精品高潮| 日韩福利伦理影院免费| 国产精品久久久久久久天堂| 欧美一级片在线播放| 激情成人在线视频| 亚洲欧美制服另类日韩| 国产精品伦子伦免费视频| 国产欧美日韩免费看aⅴ视频| 精品久久久久久久中文字幕| 粗暴蹂躏中文一区二区三区| 欧美午夜www高清视频| 国产精品美乳一区二区免费| 日韩美女视频中文字幕| 亚洲成人网久久久| 日韩视频中文字幕| 国产亚洲人成a一在线v站| 91精品视频在线| 亚洲大胆人体av| 日韩一区二区在线视频| 69久久夜色精品国产7777| 7m精品福利视频导航| 黄色成人在线免费| 欧美孕妇性xx| 亚洲精品久久久久久久久| 91欧美精品成人综合在线观看|