最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實(shí)例講解Java設(shè)計(jì)模式編程中如何運(yùn)用代理模式

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

定義:   

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

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

一般描述:

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

  1.     抽象主題:是一個抽象類或接口,是一個普通的業(yè)務(wù)類型定義。
  2.     具體主題:業(yè)務(wù)邏輯的具體執(zhí)行者
  3.     代理角色:負(fù)責(zé)對真是角色的應(yīng)用,把所有抽象主題類定義的方法限制委托給真實(shí)主題角色實(shí)現(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è)務(wù)邏輯...");
  }
}

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)點(diǎn)

    1. 職責(zé)清晰

    2. 高擴(kuò)展

代理模式的擴(kuò)展:

普通代理:

    具體主題類對高層透明,在代理主題類中構(gòu)造具體主題類

代碼實(shí)現(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è)務(wù)邏輯...");
  }
   
  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();
  }
   
}


強(qiáng)制代理:

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

代碼實(shí)現(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è)務(wù)邏輯...");
    }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();
  }
}

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


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

相關(guān)文章

  • springBoot項(xiàng)目配置文件加載優(yōu)先級及同配置覆蓋問題詳解

    springBoot項(xiàng)目配置文件加載優(yōu)先級及同配置覆蓋問題詳解

    SpringBoot配置?件可以放置在多種路徑下,不同路徑下的配置優(yōu)先級有所不同,下面這篇文章主要給大家介紹了關(guān)于springBoot項(xiàng)目配置文件加載優(yōu)先級及同配置覆蓋問題的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Java生成Markdown格式內(nèi)容完整代碼示例

    Java生成Markdown格式內(nèi)容完整代碼示例

    這篇文章主要介紹了將Java對象數(shù)據(jù)生成為Markdown文本,并提供了一個MarkdownUtil工具類進(jìn)行處理,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java總結(jié)篇系列:Java泛型詳解

    Java總結(jié)篇系列:Java泛型詳解

    下面小編就為大家?guī)硪黄狫ava總結(jié)篇系列:Java泛型詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • java正則表達(dá)式使用示例

    java正則表達(dá)式使用示例

    這篇文章主要介紹了java正則表達(dá)式使用示例,實(shí)現(xiàn)拆分字符串、替換字符串、判斷字符串是否與制定模式匹配等功能,需要的朋友可以參考下
    2014-03-03
  • 使用shardingsphere對SQLServer坑的解決

    使用shardingsphere對SQLServer坑的解決

    本文主要介紹了使用shardingsphere對SQLServer坑的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • 二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點(diǎn)數(shù)詳解

    二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點(diǎn)數(shù)詳解

    這篇文章主要介紹了二叉樹基本操作之遞歸和非遞歸遍歷、分支節(jié)點(diǎn)數(shù)詳解,二叉樹是由n(n>=0)個結(jié)點(diǎn)的有限集合構(gòu)成,此集合或者為空集,或者由一個根結(jié)點(diǎn)及兩棵互不相交的左右子樹組成,并且左右子樹都是二叉樹,需要的朋友可以參考下
    2023-09-09
  • Java中使用BeanMap將對象轉(zhuǎn)為Map詳解

    Java中使用BeanMap將對象轉(zhuǎn)為Map詳解

    這篇文章主要介紹了Java中使用BeanMap將對象轉(zhuǎn)為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫中的一個類,BeanMap?可以將?Java?對象的屬性作為鍵,屬性值作為對應(yīng)的值,存儲在一個?Map?中,它提供了一種將?Java?對象轉(zhuǎn)換為?Map?的方式,需要的朋友可以參考下
    2024-01-01
  • Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集下

    Java?數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集下

    二叉樹可以簡單理解為對于一個節(jié)點(diǎn)來說,最多擁有一個上級節(jié)點(diǎn),同時最多具備左右兩個下級節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過實(shí)際題目來熟練掌握
    2022-04-04
  • Java實(shí)現(xiàn)的連續(xù)奇數(shù)(n+2*x)是合數(shù)的算法題暴力算法

    Java實(shí)現(xiàn)的連續(xù)奇數(shù)(n+2*x)是合數(shù)的算法題暴力算法

    這篇文章主要介紹了Java實(shí)現(xiàn)的連續(xù)奇數(shù)(n+2*x)是合數(shù)的算法題暴力算法,本文包含運(yùn)算結(jié)果和實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • POI對Excel自定義日期格式的讀取(實(shí)例代碼)

    POI對Excel自定義日期格式的讀取(實(shí)例代碼)

    下面小編就為大家?guī)硪黄狿OI對Excel自定義日期格式的讀取(實(shí)例代碼)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11

最新評論

讷河市| 巧家县| 东明县| 新民市| 苏尼特右旗| 临泉县| 桐乡市| 察隅县| 漳浦县| 高密市| 上思县| 河东区| 调兵山市| 垫江县| 鹿泉市| 集贤县| 南宁市| 子长县| 繁峙县| 成都市| 始兴县| 太原市| 龙门县| 谢通门县| 洛浦县| 乌拉特中旗| 邢台市| 葵青区| 甘南县| 报价| 永吉县| 沙田区| 丹阳市| 安泽县| 广平县| 盐亭县| 海口市| 泗水县| 桓仁| 大余县| 鄂托克旗|