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

    浏览量

    1886
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    本课讲为大家讲解CKS32F4xx系列产品的低功耗模式睡眠(Sleep)模式。MCU为满足某些应用场景:如小型化低容量设备,长期监测设备等,低功耗应运而生,其中根据需求,用户可以选择睡眠模式
    发表于 06-26 10:02 902次阅读
    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.8w次阅读
    适配器<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 5527次阅读
    适配器<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 1417次阅读

    设计模式结构性:代理模式

    代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式
    的头像 发表于 06-09 15:27 1246次阅读
    设计<b class='flag-5'>模式</b>结构性:<b class='flag-5'>代理</b><b class='flag-5'>模式</b>

    装饰器模式代理模式的区别

    什么是装饰器模式 装饰器模式(Decorator Pattern): 在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责; 感觉和继承如出一辙,不改变父类,子类可拓展功能; 优点 装饰类
    的头像 发表于 10-08 14:25 6089次阅读
    装饰器<b class='flag-5'>模式</b>和<b class='flag-5'>代理</b><b class='flag-5'>模式</b>的区别

    设计模式代理模式的使用场景

    设计模式在我看来更像是一种设计思维或设计思想,它就像《孙子兵法》一样,为你的项目工程提供方向,让你的项目工程更加健壮、灵活,延续生命力。本文即将分享的是设计模式的其中一种:代理模式
    的头像 发表于 10-08 14:34 1851次阅读
    设计<b class='flag-5'>模式</b>中<b class='flag-5'>代理</b><b class='flag-5'>模式</b>的使用场景

    实践GoF的23种设计模式:备忘录模式

    相对于代理模式、工厂模式等设计模式,备忘录模式(Memento)在我们日常开发中出镜率并不高,除了应用场景的限制之外,另一个原因,可能是备忘
    的头像 发表于 11-25 09:05 1083次阅读
    实践GoF的23种设计<b class='flag-5'>模式</b>:备忘录<b class='flag-5'>模式</b>