国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【設(shè)計(jì)模式】第七章:代理模式詳解及應(yīng)用案例

這篇具有很好參考價值的文章主要介紹了【設(shè)計(jì)模式】第七章:代理模式詳解及應(yīng)用案例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

系列文章

【設(shè)計(jì)模式】七大設(shè)計(jì)原則
【設(shè)計(jì)模式】第一章:單例模式
【設(shè)計(jì)模式】第二章:工廠模式
【設(shè)計(jì)模式】第三章:建造者模式
【設(shè)計(jì)模式】第四章:原型模式
【設(shè)計(jì)模式】第五章:適配器模式
【設(shè)計(jì)模式】第六章:裝飾器模式
【設(shè)計(jì)模式】第七章:代理模式
【設(shè)計(jì)模式】第八章:橋接模式
【設(shè)計(jì)模式】第九章:外觀模式 / 門面模式
【設(shè)計(jì)模式】第十章:組合模式
【設(shè)計(jì)模式】第十一章:享元模式
【設(shè)計(jì)模式】第十二章:觀察者模式
【設(shè)計(jì)模式】第十三章:模板方法模式
【設(shè)計(jì)模式】第十四章:策略模式
【設(shè)計(jì)模式】第十五章:責(zé)任鏈模式
【設(shè)計(jì)模式】第十六章:迭代器模式
【設(shè)計(jì)模式】第十七章:狀態(tài)模式
【設(shè)計(jì)模式】第十八章:備忘錄模式
【設(shè)計(jì)模式】第十九章:訪問者模式
【設(shè)計(jì)模式】第二十章:解釋器模式
【設(shè)計(jì)模式】第二十一章:命令模式
【設(shè)計(jì)模式】第二十二章:中介者模式



一、定義

摘自百度百科: 所謂的代理者是指一個類別可以作為其它東西的接口。代理者可以作任何東西的接口:網(wǎng)上連接、存儲器中的大對象、文件或其它昂貴或無法復(fù)制的資源。


二、角色分類

抽象主題角色(Subject)

定義了代理角色和真實(shí)主題角色的共同接口,代理角色通過該接口調(diào)用真實(shí)主題角色的方法。

真實(shí)主題角色(Real Subject)

實(shí)現(xiàn)了抽象主題角色的接口,代表真實(shí)的業(yè)務(wù)對象。

代理角色(Proxy)

實(shí)現(xiàn)了抽象主題角色定義的接口,并持有真實(shí)主題角色的引用,代表了真實(shí)主題角色的代理。在代理角色中,可以添加額外的功能,如記錄日志、權(quán)限控制等,而這些功能并不是真實(shí)主題角色本身所具備的功能

客戶(Client)

具體調(diào)用代理者的角色


三、UML圖

【設(shè)計(jì)模式】第七章:代理模式詳解及應(yīng)用案例,設(shè)計(jì)模式,設(shè)計(jì)模式,代理模式


四、實(shí)現(xiàn)方式

需求分析

假如我們有一個這樣的場景:我們想要去看電影,但是我們嫌麻煩不想去電影院排隊(duì)買票,這時候我們可以選擇第三方的平臺來買票,并且代理會為我們處理一切的購票相關(guān)的事務(wù),包括選座、付款等。其實(shí)這種模式就相當(dāng)于我們設(shè)計(jì)模式中的代理模式,其代理第三方平臺,接下來我們用代碼來實(shí)現(xiàn)一下這個業(yè)務(wù)。

具體實(shí)現(xiàn)

簡單實(shí)現(xiàn)

抽象主題角色(Subject)

public interface Subject {
  void request();
}

真實(shí)主題角色(Real Subject)

public class RealSubject implements Subject {
  public void request() {
    System.out.println("RealSubject: 處理請求中");
  }
}

代理角色(Proxy)

public class Proxy implements Subject {
  private RealSubject realSubject;

  public void request() {
    if (null == realSubject) {
      realSubject = new RealSubject();
    }
    preRequest();
    realSubject.request();
    postRequest();
  }

  private void preRequest() {
    System.out.println("Proxy: 請求前執(zhí)行邏輯");
  }

  private void postRequest() {
    System.out.println("Proxy: 請求后執(zhí)行邏輯");
  }
}

客戶角色(Client)

public class Client {
  public static void main(String[] args) {
    Subject subject = new Proxy();
    subject.request();
  }
}

運(yùn)行結(jié)果

Proxy:請求前執(zhí)行邏輯
RealSubject: 處理請求中
Proxy: 請求后處理邏輯

動態(tài)代理

我們有一個接口 Subject 和其一個實(shí)現(xiàn)類 RealSubject,我們要使用JDK的動態(tài)代理來生成一個代理對象Proxy,代理對象的調(diào)用會轉(zhuǎn)發(fā)給RealSubject對象。

抽象主題角色(Subject)

public interface Subject {
  void request();
}

真實(shí)主題角色(Real Subject)

public class RealSubject implements Subject {
  @Override
  public void request() {
    System.out.println("RealSubject: 處理請求中");
  }
}

動態(tài)代理角色(DynamicProxy)

public class DynamicProxy implements InvocationHandler {
  private Object realObject;

  public DynamicProxy(Object realObject) {
    this.realObject = realObject;
  }

  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    // 調(diào)用前執(zhí)行
    System.out.println("DynamicProxy: 請求后執(zhí)行邏輯");

    // 執(zhí)行實(shí)際方法
    Object result = method.invoke(realObject, args);

    // 調(diào)用后執(zhí)行
    System.out.println("DynamicProxy: 請求后執(zhí)行邏輯");

    return result;
  }
}

客戶角色(Client)

public class Client {
  public static void main(String[] args) {
    // 創(chuàng)建被代理對象
    RealSubject realSubject = new RealSubject();

    // 創(chuàng)建代理對象
    Subject proxy = (Subject) Proxy.newProxyInstance(
      realSubject.getClass().getClassLoader,
      realSubject.getClass().getInterfaces(),
      new DynamicProxy(realSubject)
    );

    // 調(diào)用代理對象的方法
    proxy.request();
  }
}

運(yùn)行結(jié)果

DynamicProxy: 請求前執(zhí)行邏輯
RealSubject: 處理請求中
DynamicProxy: 請求后執(zhí)行邏輯

在上述代碼中,RealSubject表示真實(shí)的業(yè)務(wù)實(shí)現(xiàn)類,DynamicProxy表示動態(tài)代理類,Client表示客戶端。我們通過創(chuàng)建RealSubject對象,然后創(chuàng)建一個代理對象proxy來訪問RealSubject。

在代理對象中,我們實(shí)現(xiàn)了InvocationHandler接口,并重寫了其中的invoke()方法,在調(diào)用代理對象的方法時,invoke()方法會被自動調(diào)用。在invoke()方法中,我們可以進(jìn)行一些額外的操作,比如在調(diào)用實(shí)際對象的方法前后添加日志等。

使用Proxy.newProxyInstance()方法來創(chuàng)建代理對象。該方法需要傳入三個參數(shù):ClassLoader對象,Class對象數(shù)組和InvocationHandler對象。其中,ClassLoader對象用于加載代理類,Class對象數(shù)組表示代理類需要實(shí)現(xiàn)的接口列表,InvocationHandler對象用于處理代理對象的方法調(diào)用。


五、應(yīng)用場景

以下部分內(nèi)容摘自菜鳥教程

意圖: 為其他對象提供一種代理,以控制對這個對象的訪問。

主要解決: 解決了在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中,有些對象由于某些原因(比如對象創(chuàng)建開銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問),直接訪問會給使用者或者系統(tǒng)結(jié)構(gòu)帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

何時使用: 想在訪問一個類時做一些控制。

如何解決: 增加中間層。

關(guān)鍵代碼: 實(shí)現(xiàn)與被代理類組合。

應(yīng)用實(shí)例:

  1. Windows中的快捷方式
  2. 豬八戒去找高翠蘭,結(jié)果卻是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來,高翠蘭本人和孫悟空都實(shí)現(xiàn)了這個接口,豬八戒在訪問高翠蘭的時候看不出來這個是悟空,所以此時孫悟空是高翠蘭的代理類
  3. 買火車票不一定在火車站買,也可以去代售點(diǎn)
  4. 一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來替代現(xiàn)金,并提供對簽發(fā)賬號上資金的控制
  5. Spring AOP

適用場景:

按職責(zé)劃分通常有以下場景:

  1. 遠(yuǎn)程代理
  2. 虛擬代理
  3. Copy-on-Write代理
  4. 保護(hù)(Protect or Access)代理
  5. Cache代理
  6. 防火墻(Firewall)代理
  7. 同步化(Synchronization)代理
  8. 智能引用(Smart Reference)代理

注意事項(xiàng):

  1. 和適配器模式區(qū)別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口
  2. 與裝飾器的區(qū)別:裝飾器模式為了增強(qiáng)功能,而代理模式是為了加以控制

六、優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  1. 職責(zé)清晰
  2. 擴(kuò)展性高
  3. 智能化

缺點(diǎn)

  1. 由于在客戶端和真實(shí)主題中間加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢
  2. 實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜

推薦

關(guān)注博客和公眾號獲取最新文章

Bummon’s Blog | Bummon’s Home | 公眾號文章來源地址http://www.zghlxwxcb.cn/news/detail-525415.html

到了這里,關(guān)于【設(shè)計(jì)模式】第七章:代理模式詳解及應(yīng)用案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于FPGA的UDP協(xié)議棧設(shè)計(jì)第七章_RGMII模塊設(shè)計(jì)

    基于FPGA的UDP協(xié)議棧設(shè)計(jì)第七章_RGMII模塊設(shè)計(jì)

    該部分內(nèi)容主要需要掌握各種IO和時鐘相關(guān)的原語使用 以太網(wǎng)的通信離不開PHY芯片,PHY芯片實(shí)現(xiàn)實(shí)現(xiàn)了RGMII接口到網(wǎng)口(RJ45)的轉(zhuǎn)換, RGMII接口就是PHY芯片和FPGA之間的接口。 GMII :GMII(Gigabit Media Independant Interface),千兆MII接口。GMII采用8位接口數(shù)據(jù),工作時鐘125MHz,因此傳

    2024年04月15日
    瀏覽(23)
  • 智能尋跡避障清障機(jī)器人設(shè)計(jì)(第七章)

    本課題的智能小車實(shí)現(xiàn)了紅外與藍(lán)牙雙控,可以通過紅外遙控器或者藍(lán)牙遙控器使智能小車實(shí)現(xiàn)調(diào)速、前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、左旋轉(zhuǎn)、右旋轉(zhuǎn)、機(jī)械臂上下左右運(yùn)動以及夾子的張閉,可以抓取搬運(yùn)物品。除此之外,智能小車還具備了尋跡功能,可以根據(jù)黑線進(jìn)行尋跡;避

    2024年01月17日
    瀏覽(14)
  • 中文編程入門(Lua5.4.6中文版)第七章 Lua 字符串與模式

    中文編程入門(Lua5.4.6中文版)第七章 Lua 字符串與模式

    在網(wǎng)游的符文之地中,我們可以通過神秘的“字符串法術(shù)”來處理和操作一系列字符。以下是如何在Lua的魔法卷軸上施展這種法術(shù): 字符串的表示與召喚: ?在Lua的魔法治則中,你可以運(yùn)用三種方式召喚出一串字符(即字符串): 單引號(\\\')內(nèi)的字符序列。 雙引號(\\\")內(nèi)的字符

    2024年03月19日
    瀏覽(19)
  • 第七章 函數(shù)矩陣

    第七章 函數(shù)矩陣

    和矩陣函數(shù)不同的是,函數(shù)矩陣本質(zhì)上是一個矩陣,是以函數(shù)作為元素的矩陣。 矩陣函數(shù)本質(zhì)上是一個矩陣,是以矩陣作為自變量的函數(shù)。 函數(shù)矩陣和數(shù)字矩陣的運(yùn)算法則完全相同。 不過矩陣的元素 a i j ( x ) a_{ij}(x) a ij ? ( x ) 需要是閉區(qū)間 [ a , b ] [a,b] [ a , b ] 上的實(shí)函數(shù)

    2024年02月04日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)第七章

    數(shù)據(jù)結(jié)構(gòu)第七章

    圖(Graph)G由兩個集合V和E組成,記為G=(V, E),其中V是頂點(diǎn)的有窮非空集合,E是V中頂點(diǎn)偶對的有窮集合,這些頂點(diǎn)偶對稱為邊。V(G)和E(G)通常分別表示圖G的頂點(diǎn)集合和邊集合,E(G)可以為空集。若EG)為空,則圖G只有頂點(diǎn)而沒有邊。 子圖:假設(shè)有兩個圖G=(V,E)和G1=(V1,E1);如果V1

    2024年02月03日
    瀏覽(26)
  • 第七章 圖論

    第七章 圖論

    第七章 圖論 一、數(shù)據(jù)結(jié)構(gòu)定義 圖的鄰接矩陣存儲法 圖的鄰接表存儲法 把所有節(jié)點(diǎn)存儲為節(jié)點(diǎn)數(shù)組,每個節(jié)點(diǎn)里有自己的數(shù)據(jù)和一個邊指針,這個邊指針相當(dāng)于一個鏈表的頭指針,這個鏈表里存放所有與這個節(jié)點(diǎn)相連的邊,邊里存放該邊指向的節(jié)點(diǎn)編號和下一條邊指針 圖的

    2024年02月14日
    瀏覽(78)
  • [JavaScript] 第七章 對象

    [JavaScript] 第七章 對象

    ??作者主頁:青花鎖 ??簡介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??、Java微服務(wù)架構(gòu)公號作者?? ??簡歷模板、學(xué)習(xí)資料、面試題庫、技術(shù)互助 ??文末獲取聯(lián)系方式 ?? [Java項(xiàng)目實(shí)戰(zhàn)] 介紹Java組件安裝、使用;手寫框架等 [Aws服務(wù)器實(shí)戰(zhàn)] Aws Linux服務(wù)器上操作nginx、git、JDK、Vue等 [Java微服務(wù)

    2024年02月02日
    瀏覽(61)
  • 第七章金融中介

    ?? ? ? ? 金融中介是通過向資金盈余者發(fā)行 間接融資合約( 如存款單),并和資金短缺者達(dá)成 間接投資合約 (發(fā)放信貸)或購買其發(fā)行的證券,在資金供求方之間融通資金,對資金跨期、跨域進(jìn)行優(yōu)化配置的金融機(jī)構(gòu)。 ? ? ? ? 金融體系由金融市場和金融中介構(gòu)成,以銀行業(yè)為

    2024年02月04日
    瀏覽(26)
  • python第七章(字典)

    python第七章(字典)

    一。字典(類型為dict)的特點(diǎn): 1.符號為大括號 2.數(shù)據(jù)為鍵值對形式出現(xiàn) 3.各個鍵值對之間以逗號隔開 格式:str1={\\\'name\\\':\\\'Tom\\\'}? name相當(dāng)于鍵值(key),Tom相當(dāng)于值 二??兆值涞膭?chuàng)建方法 三。字典的基本操作(增刪改查) 1.字典的增加操作:字典序列[key] = 值 注意點(diǎn):如果存

    2024年01月24日
    瀏覽(46)
  • 第七章 測試

    第七章 測試

    7.1.1 選擇程序設(shè)計(jì)語言 1. 計(jì)算機(jī)程序設(shè)計(jì)語言基本上可以分為匯編語言和高級語言 2. 從應(yīng)用特點(diǎn)看,高級語言可分為基礎(chǔ)語言、結(jié)構(gòu)化語言、專用語言 01 有理想的模塊化機(jī)制; 02 可讀性好的控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu); 03 便于調(diào)試和提高軟件可靠性; 04 編譯程序發(fā)現(xiàn)程序錯誤的

    2024年02月08日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包