1. 程式人生 > >詳淡設計模式-代理(Proxy)

詳淡設計模式-代理(Proxy)

文章目錄

代理模式(英語:Proxy Pattern)

  代理模式是Java常見的設計模式之一。所謂代理模式是指客戶端並不直接呼叫實際的物件,而是通過呼叫代理,來間接的呼叫實際的物件。
  為什麼要採用這種間接的形式來呼叫物件呢?一般是因為客戶端不想直接訪問實際的物件,或者訪問實際的物件存在困難,因此通過一個代理物件來完成間接的訪問。
  在現實生活中,這種情形非常的常見,比如請一個律師代理來打官司。
  代理模式分為靜態代理和動態代理

代理模式的UML圖
在這裡插入圖片描述
代理模式中的角色

  抽象主題角色(Subject):聲明瞭目標物件和代理物件的共同介面,這樣一來在任何可以使用目標物件的地方都可以使用代理物件。
  具體主題角色(RealSubject):也稱為委託角色或者被代理角色。定義了代理物件所代表的目標物件。
  代理主題角色(Proxy):也叫委託類、代理類。代理物件內部含有目標物件的引用,從而可以在任何時候操作目標物件;代理物件提供一個與目標物件相同的介面,以便可以在任何時候替代目標物件。代理物件通常在客戶端呼叫傳遞給目標物件之前或之後,執行某個操作,而不是單純地將呼叫傳遞給目標物件。

1.靜態代理

  靜態代理是由程式猿建立或特定工具自動生成原始碼,再對其編譯。在程式執行前,代理類的.class檔案就已經存在了。靜態代理有兩種實現方式,繼承和聚合

 1.1 繼承

—待完善—

 1.2 聚合

—待完善—


2.動態代理

  動態代理是指在執行時,動態生成代理類。即,代理類的位元組碼將在執行時生成並載入當前的ClassLoader。與靜態代理類想比,動態類有諸多好處。首先,不需要為正式主體寫一個形式上完全一樣的封裝類,假如主題介面中的方法很多,為每一個介面寫一個代理方法也是非常煩人的事,如果介面有變動,則正式主體和代理類都要修改,不利於系統維護;其次,使用一些動態代理的生成方法甚至可以在執行時指定代理類的執行邏輯,從而大大提升系統的靈活性。

 2.1 jdk動態代理

 2.1.1實現想路

  a) 根據目標物件、代理方法(InvocationHandler裡的invoke方法),通過反射機制動態生成代理類(位元組形式儲存)
  b) 根據位元組生成代理類類物件
  c) 返回代理物件

 2.1.2使用方法

  a) 建立類,實現InvocationHandler介面,在invoke方法中寫自己的增強邏輯
  b) 呼叫Proxy.newInstance(類載入器,要實現的介面陣列,目標物件)生成代理類的物件
  c) 使用代理物件

 2.1.2案例

—待完善—

 2.2cglib動態代理

—待完善—