欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實例講解Java設計模式編程中如何運用代理模式

 更新時間:2016年02月04日 10:01:55   作者:Zhang_H  
這篇文章主要介紹了Java設計模式編程中如何運用代理模式,文中舉了普通代理和強制代理的例子作為代理模式的擴展內(nèi)容,需要的朋友可以參考下

定義:   

    Provide a surrogate or placeholder for another object to control access to it.

    為其他對象一種代理以控制對這個對象的訪問。

一般描述:

    一般包含的三個角色:抽象主題、具體主題、代理主題。

  1.     抽象主題:是一個抽象類或接口,是一個普通的業(yè)務類型定義。
  2.     具體主題:業(yè)務邏輯的具體執(zhí)行者
  3.     代理角色:負責對真是角色的應用,把所有抽象主題類定義的方法限制委托給真實主題角色實現(xiàn)。

通用類圖:

20162495652904.jpg (511×386)

通用代碼:

package Proxy;
//抽象主題類:
public interface Subject {
  public void doSomething();
}

package Proxy;
//具體主題類
public class RealSubject implements Subject{
  @Override
  public void doSomething() {
    System.out.println("業(yè)務邏輯...");
  }
}

package Proxy;
//代理主題類
public class Proxy implements Subject{
   
  private Subject sub = null; 
   
  @Override
  public void doSomething() {
    this.sub.doSomething();   
  }
   
  public Proxy(Subject sub){
    this.sub = sub;
  }
   
   
}

package Proxy;
//客戶端
public class Client {
  public static void main(String[] args) {
     
    Subject realsub = new RealSubject();
    Subject proxy = new Proxy(realsub);
     
    proxy.doSomething();
  }
}

優(yōu)點

    1. 職責清晰

    2. 高擴展

代理模式的擴展:

普通代理:

    具體主題類對高層透明,在代理主題類中構造具體主題類

代碼實現(xiàn):

package GeneralProxy;
 
public interface Subject {
  public void doSomething();
}

package GeneralProxy;
 
public class RealSubject implements Subject{
   
  private String name = null;
   
  @Override
  public void doSomething() {
    System.out.println(this.name + "被代理,正在執(zhí)行業(yè)務邏輯...");
  }
   
  public RealSubject(Subject proxy,String name) throws Exception{
    if(proxy == null){
      throw new Exception("無法創(chuàng)建被代理對象");
    }else{
      this.name = name;
    }
       
  }
}

package GeneralProxy;
 
public class Proxy implements Subject{
 
  private Subject realsub = null;
     
  public Proxy(String name) {
    try {
      realsub = new RealSubject(this, name);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
   
  public void doSomething() {
    realsub.doSomething();
  }
}

package GeneralProxy;
 
public class Client {
  public static void main(String[] args) {
    //普通代理
    Subject proxy = new Proxy("張三");        
    proxy.doSomethaing();
  }
   
}


強制代理:

    必須通過訪問具體主題類獲取代理主題類的對象,然后用代理主題類控制訪問   

代碼實現(xiàn):

package MustProxy;
 
public interface Subject {
  public void doSomething();
   
  public Subject getProxy();
}

package MustProxy;
 
public class RealSubject implements Subject{
   
  private String name = null;
  private Subject proxy = null;
   
  @Override
  public void doSomething() {
    if(isProxy()){
      System.out.println(this.name + "被代理,正在執(zhí)行業(yè)務邏輯...");
    }else{
      System.out.println("請先訪問代理...");
    }
     
  }
   
  public RealSubject(String name) {
    this.name = name;
  }
   
  public Subject getProxy() {
 
    proxy = new Proxy(this);
    return this.proxy;
  }
   
  private boolean isProxy(){
    if(this.proxy == null){
      return false;
    }else{
      return true;
    }
       
  }
}

package MustProxy;
 
public class Proxy implements Subject{
 
  private Subject realSub = null;
   
  public Proxy(Subject realSub) {
    this.realSub = realSub;
  }
   
  public void doSomething() {   
    this.realSub.doSomething();
  }
   
 
  public Subject getProxy() {
 
    return this;
  }
}

package MustProxy;
 
public class Client {
  public static void main(String[] args) {
    Subject realSub = new RealSubject("張三");
    realSub.doSomething();
     
    Subject proxy = realSub.getProxy();
    proxy.doSomething();
  }
}

應用場景
現(xiàn)實世界中,秘書就相當于一個代理,老板開會,那么通知員工開會時間、布置會場、會后整理會場等等開會相關工作就可以交給秘書做,老板就只需要開會就行了,不需要親自做那些事。同理,在我們程序設計中也可使用代理模式來將由一系列無關邏輯組合在一起的代碼進行解耦合,比如業(yè)務代碼中的日志代碼就可以在代理中進行。Spring的AOP就是典型的動態(tài)代理應用。


代理模式的應用形式
(1)遠程代理(Remote Proxy) -可以隱藏一個對象存在于不同地址空間的事實。也使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。
(2)虛擬代理(Virtual Proxy) – 允許內(nèi)存開銷較大的對象在需要的時候創(chuàng)建。只有我們真正需要這個對象的時候才創(chuàng)建。
(3)寫入時復制代理(Copy-On-Write Proxy) – 用來控制對象的復制,方法是延遲對象的復制,直到客戶真的需要為止。是虛擬代理的一個變體。
(4)保護代理(Protection (Access)Proxy) – 為不同的客戶提供不同級別的目標對象訪問權限
(5)緩存代理(Cache Proxy) – 為開銷大的運算結果提供暫時存儲,它允許多個客戶共享結果,以減少計算或網(wǎng)絡延遲。
(6)防火墻代理(Firewall Proxy) – 控制網(wǎng)絡資源的訪問,保護主題免于惡意客戶的侵害。
(7)同步代理(SynchronizationProxy) – 在多線程的情況下為主題提供安全的訪問。
(8)智能引用代理(Smart ReferenceProxy) - 當一個對象被引用時,提供一些額外的操作,比如將對此對象調(diào)用的次數(shù)記錄下來等。
(9)復雜隱藏代理(Complexity HidingProxy) – 用來隱藏一個類的復雜集合的復雜度,并進行訪問控制。有時候也稱為外觀代理(Façade Proxy),這不難理解。復雜隱藏代理和外觀模式是不一樣的,因為代理控制訪問,而外觀模式是不一樣的,因為代理控制訪問,而外觀模式只提供另一組接口。
 
 

相關文章

  • java刪除指定目錄下指定格式文件的方法

    java刪除指定目錄下指定格式文件的方法

    這篇文章主要為大家詳細介紹了java刪除指定目錄下指定格式文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java8中 LocalDate和java.sql.Date的相互轉換操作

    Java8中 LocalDate和java.sql.Date的相互轉換操作

    這篇文章主要介紹了Java8中 LocalDate和java.sql.Date的相互轉換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java集合ArrayList與LinkedList詳解

    Java集合ArrayList與LinkedList詳解

    這篇文章主要介紹了Java集合ArrayList與LinkedList詳解,對于ArrayList和LinkedList,他們都是List接口的一個實現(xiàn)類,并且我們知道他們的實現(xiàn)方式各不相同,例如ArrayList底層實現(xiàn)是一個數(shù)組
    2022-08-08
  • logback自定義json日志輸出示例詳解

    logback自定義json日志輸出示例詳解

    這篇文章主要為大家介紹了logback自定義json日志輸出,就是通過logback日志體系以及l(fā)ogstash提供的json?log依賴將數(shù)據(jù)以json格式記錄到日志文件的例子
    2022-03-03
  • idea社區(qū)版如何設置vm?options

    idea社區(qū)版如何設置vm?options

    這篇文章主要介紹了idea社區(qū)版如何設置vm?options問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring Boot security 默認攔截靜態(tài)資源的解決方法

    Spring Boot security 默認攔截靜態(tài)資源的解決方法

    這篇文章主要介紹了Spring Boot security 默認攔截靜態(tài)資源,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java設計模式中的適配器模式

    Java設計模式中的適配器模式

    這篇文章主要介紹了Java設計模式中的適配器模式,適配器模式(Adapter Pattern)將某個類的接口轉換成客戶端期望的另一個接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個類可以協(xié)同工作。其別名為包裝器
    2022-07-07
  • Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦

    Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦

    在項目開發(fā)過程中需要根據(jù)兩地經(jīng)緯度坐標計算兩地間距離,下面這篇文章主要給大家介紹了關于Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法以及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦,需要的朋友可以參考下
    2023-12-12
  • Springmvc異常映射2種實現(xiàn)方法

    Springmvc異常映射2種實現(xiàn)方法

    這篇文章主要介紹了Springmvc異常映射2種實現(xiàn)方法以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。,需要的朋友可以參考下
    2020-05-05
  • Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務問題

    Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務問題

    當進行業(yè)務操作時,訂單發(fā)生異常 ,進行了回滾操作,因為在不同的數(shù)據(jù)庫實例中,余額卻扣除成功,此時發(fā)現(xiàn)數(shù)據(jù)不一致問題,本文給大家介紹Seata集成Mybatis-Plus解決多數(shù)據(jù)源事務問題,感興趣的朋友一起看看吧
    2023-11-11

最新評論