那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

設計模式之代理模式:武器附魔之道

京東云 ? 來源:京東保險 孫昊宇 ? 作者:京東保險 孫昊宇 ? 2025-01-24 11:45 ? 次閱讀

作者:京東保險 孫昊宇

大家好,今天我們聊聊設計模式中的代理模式。作為一種經典設計模式,它的應用極為廣泛。不論你是剛剛入門,還是已經熟悉設計模式,相信這篇文章都會讓你有所收獲。

一、引子:叫個代駕

讓我們從一個引子開始:司機和代駕。「私家車司機」和「代駕」是什么關系?很簡單,「私家車司機」是客戶,「代駕」負責提供服務,幫他們開車。

不同點: 「私家車司機」有自己的車,他們可能自己開車,也可能找代駕開車;

「代駕」沒有自己的車,但他們會接到代駕訂單,從而開「私家車司機」的車。

相同點: 他們都會開車,有駕照。換句話說,他們都屬于「司機」。

說到這里,我想他們的關系就很清楚了:「司機」是「私家車司機」和「代駕」的父類。雖然都會開車,但他們對“開車”這個行為有不同的實現。

讓我們把這三個類的關系表示出來。首先定義一個抽象類「司機」,就叫Driver好了:

@Data
public abstract class Driver {

    String name;

    abstract void driveCar();
}

我們要求每個司機都有一個名字,且都必須會開車。

接下來看看「私家車司機」,CommonDriver類:

@Data
public class CommonDriver extends Driver {

    CommonDriver(String name) {
        this.name = name;
    }

    @Override
    public void driveCar() {
        System.out.println(this.getName() + "的汽車正在行駛...");
    }
}

也很簡單,每次開車的時候打印一行日志即可。最后看看「代駕」,就叫ProxyDriver吧:

@Data
public class ProxyDriver extends Driver {

    private Driver realDriver;

    ProxyDriver(String name, Driver realDriver) {
        this.name = name;
        this.realDriver = realDriver;
    }

    @Override
    void driveCar() {
        System.out.printf("代駕「%s」正在為%s服務...n", this.getName(), this.getRealDriver().getName());
        this.realDriver.driveCar();
    }
}

我們要求每個代駕都要有一個服務的客戶,也就是被代理的司機。我們將這位被代理的司機——realDriver作為了代駕類的私有變量存起來。當代駕在開車時,他實際上開的是客戶的車。因此,他直接去調用realDriver的開車方法即可。

三個類定義好了,讓我們先創建一個「私家車司機」——小張,讓小張自己開車;再幫他叫一個「代駕」——就叫他小代吧,讓小代幫他開車:

public class Main {
    public static void main(String[] args) {
        CommonDriver zhang = new CommonDriver("小張");
        zhang.driveCar();
        ProxyDriver proxyDriver = new ProxyDriver("小代", zhang);
        proxyDriver.driveCar();
    }
}

運行一下:

小張的汽車正在行駛... 代駕小代正在為小張服務... 小張的汽車正在行駛...

結果符合預期:不管是誰在開車,結果都是一樣的,開的都是小張的汽車。

二、代理模式:武器附魔之道

代理模式的定義

以上例子展示了一個代理模式的基本實現。代理模式(Proxy Pattern) 的定義是:使用代理以代替對真實對象的訪問。 它屬于一種結構型設計模式。

例子中的「司機」、「私家車司機」和「代駕」三個角色,分別對應了代理模式中的三個基本元素:

「私家車司機」——真實主題: 被代理的角色,是業務邏輯的具體執行者。

「代駕」——代理主題: 負責代理真實主題,所有對其業務方法的調用,都會被委托給其真實主題實現。

「司機」——抽象主題: 可以是接口,也可以是抽象類。代理主題和真實主題都會去實現/繼承同一個抽象主題。

優點及應用

為真實的對象設置一個代理,可以帶來什么好處?在哪些應用場景下,我們需要用到代理模式?

要回答這個問題,我們不妨想想代理的特點:間接訪問。沒錯,代理模式的優點就在于通過代理間接訪問真實對象。通過間接訪問,我們就可以讓代理做許多中間操作,通過這些中間操作,我們就可以在不修改真實對象的前提下,實現功能增強。

我的理解:如果把真實主題比做一把**「寶劍」,專門用來處理核心邏輯**,那么就可以將它的代理比作**「附魔」,用來給真實主題提供一些強化功能**,附魔的種類就很多啦:火焰

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代理模式
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1788
收藏 人收藏

    評論

    相關推薦

    CKS32F4xx系列MCU的低功耗模式睡眠模式

    本課講為大家講解CKS32F4xx系列產品的低功耗模式睡眠(Sleep)模式。MCU為滿足某些應用場景:如小型化低容量設備,長期監測設備等,低功耗應運而生,其中根據需求,用戶可以選擇睡眠模式
    發表于 06-26 10:02 ?675次閱讀
    CKS32F4xx系列MCU的低功耗<b class='flag-5'>模式</b><b class='flag-5'>之</b>睡眠<b class='flag-5'>模式</b>

    適配器模式代理模式的區別

      代理模式  組成:  抽象角色:通過接口或抽象類聲明真實角色實現的業務方法。  代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,并可以附加自己的
    發表于 10-22 15:17

    Modbus ASCII 模式通訊程序

    C語言編寫的臺達變頻器Modbus ASCII 模式通訊程序
    發表于 12-02 10:25 ?6次下載

    適配器模式、裝飾器模式代理模式的區別

    適配器模式、裝飾器模式代理模式都屬于設計模式中的結構型模式,結構型設計
    發表于 10-18 15:53 ?1.7w次閱讀
    適配器<b class='flag-5'>模式</b>、裝飾器<b class='flag-5'>模式</b>、<b class='flag-5'>代理</b><b class='flag-5'>模式</b>的區別

    基于RSM代理模型的武器裝備體系優化算法

    Methodology),代理模型的武器裝備體系優化算法。其中,選用響應面模型作為代理模型,通過均勻設計方法生成初始樣本點,運用最小化響應面法進行代理模型更新,采用梯度下降法進行迭代
    發表于 12-12 15:36 ?0次下載

    適配器模式代理模式的區別

    適配器模式:適配器模式有時候也稱包裝樣式或者包裝。將一個類的接口轉接成用戶所期待的。代理模式:為其他對象提供一種代理以控制對這個對象的訪問。
    發表于 01-12 11:56 ?5295次閱讀
    適配器<b class='flag-5'>模式</b>和<b class='flag-5'>代理</b><b class='flag-5'>模式</b>的區別

    C語言設計模式的程序資料合集

    本文檔的主要內容詳細介紹的是C語言設計模式的程序資料合集包括了:C語言設計模式_繼承-多態-封裝,C語言設計模式_單件
    發表于 11-16 08:00 ?5次下載

    嵌入式軟件設計設計模式

    文章目錄前言1.設計模式適配器模式2.設計模式單例模式3.設計
    發表于 10-21 11:07 ?9次下載
    嵌入式軟件設計<b class='flag-5'>之</b>設計<b class='flag-5'>模式</b>

    設計模式結構型模式

    結構型模式一、適配器模式(一)定義:適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁,它結合了兩個獨立接口的功能。這種模式涉及到一個單一的類,該類負責加入獨
    發表于 11-06 17:51 ?1次下載
    設計<b class='flag-5'>模式</b><b class='flag-5'>之</b>結構型<b class='flag-5'>模式</b>

    STM32低功耗模式待機模式

    上周完成了一個小項目,項目涉及到stm32的低功耗的待機模式,特在此記錄下32的待機模式。 芯片:STM32f030F4 庫:HAL庫 喚醒方式:用RTC和PA0的上升沿喚醒先來看下低功耗模式
    發表于 12-07 16:21 ?8次下載
    STM32低功耗<b class='flag-5'>模式</b><b class='flag-5'>之</b>待機<b class='flag-5'>模式</b>

    GoF設計模式代理模式

    它是一個使用率非常高的設計模式,在現實生活中,也是很常見。比如,演唱會門票黃牛。假設你需要看一場演唱會,但官網上門票已經售罄,于是就當天到現場通過黃牛高價買了一張。在這個例子中,黃牛就相當于演唱會門票的代理,在正式渠道無法購買門票的情況下,你通過
    的頭像 發表于 10-17 09:45 ?972次閱讀

    設計模式結構性:代理模式

    代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式
    的頭像 發表于 06-09 15:27 ?875次閱讀
    設計<b class='flag-5'>模式</b>結構性:<b class='flag-5'>代理</b><b class='flag-5'>模式</b>

    裝飾器模式代理模式的區別

    什么是裝飾器模式 裝飾器模式(Decorator Pattern): 在不改變對象自身的基礎上,在程序運行期間給對象動態的添加職責; 感覺和繼承如出一轍,不改變父類,子類可拓展功能; 優點 裝飾類
    的頭像 發表于 10-08 14:25 ?4110次閱讀
    裝飾器<b class='flag-5'>模式</b>和<b class='flag-5'>代理</b><b class='flag-5'>模式</b>的區別

    設計模式代理模式的使用場景

    設計模式在我看來更像是一種設計思維或設計思想,它就像《孫子兵法》一樣,為你的項目工程提供方向,讓你的項目工程更加健壯、靈活,延續生命力。本文即將分享的是設計模式的其中一種:代理模式
    的頭像 發表于 10-08 14:34 ?1092次閱讀
    設計<b class='flag-5'>模式</b>中<b class='flag-5'>代理</b><b class='flag-5'>模式</b>的使用場景

    實踐GoF的23種設計模式:備忘錄模式

    相對于代理模式、工廠模式等設計模式,備忘錄模式(Memento)在我們日常開發中出鏡率并不高,除了應用場景的限制之外,另一個原因,可能是備忘
    的頭像 發表于 11-25 09:05 ?592次閱讀
    實踐GoF的23種設計<b class='flag-5'>模式</b>:備忘錄<b class='flag-5'>模式</b>
    定制百家乐桌垫| 东方太阳城二手房| 百家乐秘诀| 赌博百家乐赢不了| 罗浮宫百家乐官网的玩法技巧和规则 | 大发888真人网址| 威尼斯人娱乐网上百家乐的玩法技巧和规则 | 网上百家乐官网赌场| 茶陵县| 日博娱乐城| 球探网足球比分| 网上赌博| 北京德州扑克比赛| 大发888无数| 大发888官网e世博备用网址| 威尼斯人娱乐城怎么玩| 大世界百家乐娱乐| 百家乐如何骗人| 7人百家乐中号桌布| 至尊百家乐20111110| 百家乐2珠路投注法| 百家乐怎样算大小| 百家乐赌王有哪些| 游戏机百家乐作弊| 百家乐美女视频聊天| 百家乐在线小游戏| 百家乐官网赌博软件下载| 网站百家乐官网博彩| 百家乐官网大赢家客户端| 澳门百家乐官网游戏皇冠网| 哪里有百家乐官网赌博网站| 爱赢百家乐官网开户送现金| 百家乐官网网络赌博网址| 百家乐官网投注网址| 游戏百家乐官网庄闲| 星港城百家乐官网娱乐城| 百家乐官网赢家| 最好的百家乐官网投注| 百家乐官网威尼斯人| 百家乐官网代理荐| 菲律宾百家乐官网赌场娱乐网规则 |