首页 > 其他分享 >设计模式之代理模式:武器附魔之道

设计模式之代理模式:武器附魔之道

时间:2024-12-31 11:41:40浏览次数:1  
标签:动态 代理 小张 之道 ProxyDriver 代驾 附魔 设计模式 public

作者:京东保险 孙昊宇

大家好,今天我们聊聊设计模式中的代理模式。作为一种经典设计模式,它的应用极为广泛。不论你是刚刚入门,还是已经熟悉设计模式,相信这篇文章都会让你有所收获。

一、引子:叫个代驾

让我们从一个引子开始:司机和代驾。「私家车司机」和「代驾」是什么关系?很简单,「私家车司机」是客户,「代驾」负责提供服务,帮他们开车。

不同点: 「私家车司机」有自己的车,他们可能自己开车,也可能找代驾开车;

「代驾」没有自己的车,但他们会接到代驾订单,从而开「私家车司机」的车。

相同点: 他们都会开车,有驾照。换句话说,他们都属于「司机」。

说到这里,我想他们的关系就很清楚了:「司机」是「私家车司机」和「代驾」的父类。虽然都会开车,但他们对“开车”这个行为有不同的实现。

让我们把这三个类的关系表示出来。首先定义一个抽象类「司机」,就叫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) 的定义是:使用代理以代替对真实对象的访问。 它属于一种结构型设计模式。

例子中的「司机」、「私家车司机」和「代驾」三个角色,分别对应了代理模式中的三个基本元素:

「私家车司机」——真实主题: 被代理的角色,是业务逻辑的具体执行者。

「代驾」——代理主题: 负责代理真实主题,所有对其业务方法的调用,都会被委托给其真实主题实现。

「司机」——抽象主题: 可以是接口,也可以是抽象类。代理主题和真实主题都会去实现/继承同一个抽象主题。

下面是代理模式的类图:

 

 

优点及应用

为真实的对象设置一个代理,可以带来什么好处?在哪些应用场景下,我们需要用到代理模式?

要回答这个问题,我们不妨想想代理的特点:间接访问。没错,代理模式的优点就在于通过代理间接访问真实对象。通过间接访问,我们就可以让代理做许多中间操作,通过这些中间操作,我们就可以在不修改真实对象的前提下,实现功能增强。

我的理解:如果把真实主题比做一把**「宝剑」,专门用来处理核心逻辑**,那么就可以将它的代理比作**「附魔」,用来给真实主题提供一些强化功能**,附魔的种类就很多啦:火焰

标签:动态,代理,小张,之道,ProxyDriver,代驾,附魔,设计模式,public
From: https://www.cnblogs.com/Jcloud/p/18643644

相关文章

  • Spring中的设计模式
    Spring中的设计模式控制反转(IoC)和依赖注入(DI)IoC是一个原则,而不是一个模式,以下模式(但不限于)实现了IoC原则。**SpringIoC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。**IoC容器负责创......
  • 《程序员修炼之道:从小工到专家》读书笔记(七)
    这一次读书笔记是关于第六章“当你编码时”,第六章章深入探讨了实际编码过程中的一系列实用技巧和最佳实践,聚焦程序员在日常编写代码过程中的思维模式与注意事项,助力开发者产出高质量、易维护、可读性强的代码,将前期积累的设计理念、应对变化策略落实到指尖敲击的每一行字符中,是从......
  • 《程序员修炼之道:从小工到专家》阅读笔记
    一、重视基础知识书中强调了基础知识的重要性。如同盖房子,坚实的地基才能撑起高楼大厦。对于程序员来说,像数据结构、算法等基础知识是解决复杂问题的基石。例如在处理大量数据排序时,若熟悉不同排序算法的原理和时间复杂度,就能选择最合适的算法,提高程序效率。二、注重代码质量代......
  • 微服务架构设计模式PDF免费下载
    适读人群:本书的重点是架构和开发,适合负责开发和交付软件的任何人(例如开发人员、架构师、CTO等)阅读。示例代码使用Java语言和Spring框架世界十大软件架构师之一、微服务架构先驱者亲笔撰写,微服务实用落地指南。示例代码使用Java编程和Spring框架电子版仅供预览,下载后24小时内......
  • 设计模式-工厂和单例模式
    概念和作用分类7大原则工厂模式概念工厂模式是创建型模式,它是对象创建的最佳方案,特别是创建对象过程比较复杂。(如果理解new对象就可以完成功能,不需要用工厂模式)。好处实现对象的创建和使用的解耦。分类简单工厂模式简单工厂模式简介也叫静态工厂模式,可以根据不参数......
  • 设计模式(阅读扩展代码)
    设计模式----整洁的房间,好动的猫(看源码)解决问题的特定方法解决既有稳定点,又有变化点的问题(全是稳定点写一次就可以,全是变化点--游戏开发、脚本语言不需要编译,热更新数据到服务器)修改少量代码,解决变化的问题设计模式基础面向对象的思想:封装、继承、多态(动态多态用的最多)虚函......
  • 设计模式-单例模式
    设计模式概念        设计模式简单来说就是在解决某一类问题场景时,有既定的,优秀的代码框架可以直接使用,与我们自己摸索出来的问题解决之道相比较,有以下优点可取:1、代码更易于维护,代码的可读性,复用性,可移植性,健壮性会更好2、当软件原有需求有变更或者增加新的需求时,......
  • 【设计模式与体系结构】创建型模式-建造者模式
    简介建造者模式指的是将一个复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示,分离了部件的构造(由Builder负责)和装配(由Director负责)。从而可以构造出复杂的对象,这个模式适用于某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦,不同的构建器,相同的装配,......
  • Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解
    文章目录概述结构案例实现优缺点及使用场景概述享元模式也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象;常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们......
  • 纳德拉的远见与中小企业的AI破局之道:先有组织进化,才有技术突破
    最近,微软CEO萨提亚·纳德拉的一次访谈引发了广泛关注。他抛出了一个在AI时代至关重要的观点:先有组织进化,才有技术突破。这句话看似简单,却蕴含着深刻的洞察,尤其对于想要在AI浪潮中实现弯道超车的中小企业而言,更是指明了一条清晰的路径。一、别只盯着AI光环,先看看你的“地基”稳不......