结构型设计模式02-代理模式

news2024/7/6 19:33:12

✨作者:猫十二懿

❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github

🎉公众号:猫十二懿

代理模式

1、不使用代理模式

举例说明:小明喜欢一个女生(小红),因为小红不认识小明,所以小明通过叫小华代替他送礼物给小红

可以得出的结果图:

image-20230417220311383

被追求者:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:06
 *  目标对象:被追求者小红
 */
public class ObjectGirl {
    private String girlName;

    public String getGirlName() {
        return girlName;
    }

    public void setGirlName(String girlName) {
        this.girlName = girlName;
    }
}

追求者:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 追求者
 */
public class Pursuit {
    private ObjectGirl girl;

    public Pursuit(ObjectGirl girl) {
        this.girl = girl;
    }

    public void giveFlowers() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的花。");
    }
    public void giveChocolate() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的巧克力。");
    }
    public void giveDolls() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的洋娃娃。");
    }
}

测试类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:09
 */
public class ProxyTest {
    public static void main(String[] args) {
        ObjectGirl xiaohong = new ObjectGirl();
        xiaohong.setGirlName("小红");
        Pursuit xiaoming = new Pursuit(objectGirl);
        xiaoming.giveDolls();
        xiaoming.giveFlowers();
        xiaoming.giveChocolate();
    }
}

但是你会发现,如果是这样实现的哇,就相当于小明和小红之间是认识的,但是我们的例子是说小明和小红之间不认识,所以说这样子是不能的,所以说我要通过小华这个“中间人” 😂

image-20230417223047414

2、第一次修改-只有代理模式

修改之后的UML图如下:

image-20230417221621694

代理类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 代理类
 */
public class Proxy {
    private ObjectGirl girl;

    public Proxy(ObjectGirl girl) {
        this.girl = girl;
    }

    public void giveFlowers() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的花。");
    }
    public void giveChocolate() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的巧克力。");
    }
    public void giveDolls() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的洋娃娃。");
    }
}

客户端:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:09
 */
public class ProxyTest {
    public static void main(String[] args) {
        ObjectGirl xiaohong = new ObjectGirl();
        xiaohong.setGirlName("小红");
        Pursuit xiaohua = new Pursuit(xiaohong);
        xiaohua.giveDolls();
        xiaohua.giveFlowers();
        xiaohua.giveChocolate();
    }
}

观察发现,只有代理人了,就相当于是小华直接向小红进行表白了,就把小明忽略掉了

3、 符合实际的代码

UML类图:

image-20230417222034484

接口:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:21
 */
public interface GiveGift {
    void giveDolls();

    void giveFlowers();

    void giveChocolate();
}

代理:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 代理类
 */
public class Proxy implements GiveGift {

    private Pursuit pursuit; //认识追求者


    public Proxy(ObjectGirl girl) { // 也认识被追求者
        this.pursuit = new Pursuit(girl); // 代理初始化,实际就是追求者初始化过程
    }

    public void giveFlowers() { // 代理者向被追求者松礼物
        this.pursuit.giveFlowers();
    }

    public void giveChocolate() {
        this.pursuit.giveChocolate();
    }

    public void giveDolls() {
        this.pursuit.giveDolls();
    }
}

追求者:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:04
 * 追求者
 */
public class Pursuit implements GiveGift{
    private ObjectGirl girl;

    public Pursuit(ObjectGirl girl) {
        this.girl = girl;
    }

    public void giveFlowers() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的花。");
    }
    public void giveChocolate() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的巧克力。");
    }
    public void giveDolls() {
        System.out.println(this.girl.getGirlName() + ",你好!,小明叫我送给你的洋娃娃。");
    }
}

被追求者同上。

最后的结果都是一样的:

image-20230417223039373

4、代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中,一个类代表另一个类或一些类的功能。这种类型的设计模式属于结构型模式。代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。

在代理模式中,通常会涉及到三个角色:抽象主题角色、真实主题角色和代理主题角色。

  1. 抽象主题角色声明了真实主题角色和代理主题角色的公共方法
  2. 真实主题角色实现了抽象主题角色定义的接口,代表着真实的业务实现
  3. 代理主题角色持有真实主题角色的引用,可以访问真实主题角色,同时还可以在真实主题角色基础上添加一些附加的操作

代理模式有两种不同的实现方式:静态代理和动态代理。在静态代理中,代理类在编译期间就已经确定,并且只能代理特定的接口或者类;在动态代理中,代理类是在运行时动态生成的,可以代理任意接口或者类。

代理模式的优点:

  • 职责清晰
  • 高扩展性
  • 智能化

代理模式可以控制对对象的访问,从而实现一些安全性或者监控的功能。

在使用代理模式时,需要注意的是,代理类和被代理类通常应该共同实现一个接口或者继承自同一个父类,并且需要仔细考虑代理类的生命周期和线程安全性等问题。

4.1 代理模式结构图

image-20230417223503780

ISubject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。

ISubject类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:35
 * 代理类和真实类都要实现的接口
 */
public interface ISubject {
    void request();
}

RealSubject类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:36
 * 真实的实体类
 */
public class RealSubject  implements ISubject {
    @Override
    public void request() {
        System.out.println("RealSubject do something");
    }
}

代理类:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:36
 * 代理类:代理真实类完成一些列的操作
 */
public class Proxy implements ISubject {
    private RealSubject rs; // 拥有真实类的属性

    public Proxy() {
        this.rs = new RealSubject(); // 代理初始化,也就是真实类的初始化过程
    }

    // 代理类要做的事情
    public void request() {
        this.rs.request();
    }
}

客户端:

/**
 * @author Shier
 * CreateTime 2023/4/17 22:39
 */
public class Test {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request(); // 通过代理发送给RealSubject类 // RealSubject do something
    }
}

5、 代理模式应用

  1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
  2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
  3. 安全代理,用来控制真实对象访问时的权限
  4. 智能指引,是指当调用真实的对象时,代理处理另外一些事

ng[] args) {
Proxy proxy = new Proxy();
proxy.request(); // 通过代理发送给RealSubject类 // RealSubject do something
}
}




## 5、 代理模式应用

1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
3. 安全代理,用来控制真实对象访问时的权限
4. 智能指引,是指当调用真实的对象时,代理处理另外一些事













本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】初步了解排序

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 1.排序的概念及其运用 1.1排序的概念 2.常见排序算法的实现 2.1插入排序 2.2希尔排序 问题:gap是多少合适? 1.排序的概念及其运用 1.1排序的概念 排序:所…

App上架流程

准备 开发者账号完工的项目 上架步骤 一、创建App ID二、创建证书请求文件 (CSR文件)三、创建发布证书 (CER)四、创建Provisioning Profiles配置文件 (PP文件)五、在App Store创建应用六、打包上架 一、…

设置linux的时间

目录 一、什么是时间 (1)例子1 (2)例子2 二、什么是本地时间 三、linux设置本地时间的方法 (1)方式一:通过互联网自动同步 1.修改时间同步服务器 2.查看时间同步情况 (2&…

自动化测试1

目录 1.什么是自动化测试 1.1自动化分类 1.1单元测试 1.2接口测试 1.3UI自动化测试 2.selenium 1.什么是selenium 2.selenium的特点 3.工作原理 3.seleniumJava 1.搭建 1.查看Chrome版本 2.下载Chrome浏览器驱动 3.配置,放到该目录下 2.验证是否搭建成功 1.什么是…

springboot 集成jwt的使用

1.JWT介绍 JWT(JSON Web Token)是一种基于JSON格式的身份验证和授权标准,经常用于Web应用程序中的用户身份验证。JWT由三个部分组成:头部、载荷和签名。头部包含算法和类型信息,载荷包含用户数据和元数据,…

tolua源码分析(六) C#委托使用lua函数的机制实现

tolua源码分析(六) C#委托使用lua函数的机制实现 上一节我们讨论lua层如何使用C#的enum以及使用enum需要注意的事项。这一节我们将讨论项目日常开发中经常会用到的委托注册机制,即C#层暴露若干委托和事件,然后在lua层进行注册&…

【沐风老师】3DMAX宇宙生成器(一键生成星系)插件使用方法详解

3DMAX宇宙生成器(一键生成星系)插件 3DMAX宇宙生成器(一键生成星系)插件,用于模拟星团及星系的运动。可以创建单个集合进行动画计算,也可以输入不同坐标,建立多个集合后统一进行动画计算。 【安…

探索iOS之CoreImage框架

CoreImage提供图像处理、人脸识别、图像增强、图像滤镜、图像转场。它操作的数据来自Core Graphics、Core Video、Image IO,使用CPU或GPU进行渲染。CoreImage对底层实现进行封装,为上层提供简单易用的API。 一、CoreImage框架 CoreImage框架分为&#…

计算机电脑中了勒索病毒,如何提高windows系统预防faust勒索病毒的能力

当今社会互联网技术迅猛发展,但随之而来的网络安全问题开始引起人们的重视,其中,勒索软件是当前网络安全领域中最具破坏性和危害性的恶意软件之一,而Faust勒索软件就是其中一种。 Faust勒索病毒是一种很可怕的恶意软件,能够破坏并…

计算机网络 - 网络层的数据平面

Overview 首先Network Layer负责的是host to host的传输, 然后可以分为两个平面, 控制平面以及数据平面. 数据平面: 负责forward datagrams from input to output links 决定路由器从input到output 转发功能: 基于目标地址 转发表 SDN方式基于多个字段流表 控制平面: 调…

第10届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 击鼓游戏 题目说明 准备工作: 将复台背景设置为“spotight-stage”,添加一个“Belerina"角色、两个“Drum1"角色和两个“Drum2”角色,并按照图 7-1 的位置摆放。角色“Beleina"的造型和颜色的设置须如图 7-1所示&a…

美女放电还是整形-从《人月神话》误译谈状态机图

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 在重审《人月神话》中译本的过程中,发现一处较严重的误译。 原文是: the first milepost is not reached until two months have elapsed. 原译为: 两个月…

Java中常量基础知识

1 问题 什么是字面常量? 2 方法 拿第一行输出语句来说,这行代码输出了 “hello” 这个字符串,无论何时何地运行程序,输出的这个字符串都不会变,这就是字面常量。 定义:常量即程序运行期间,固定不…

chatgpt网站优选集合

目录 chatGpt 国内镜像网站集合 chatgpt接入微信 chatgpt接入谷歌浏览器 chatgptAI绘画 最后 chatGpt 这个说实话,不用我介绍大家也都懂。不如玩一个有意思的,这里我让chatGpt自己介绍一下他自己: 嗨,大家好,我是…

C++ [STL之vector模拟实现]

本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT STL之vector模拟实现 前言正文空间结构默认成员函数构造函数拷贝构造函数赋值重载析构函数关于数据拷贝问题 迭代器容量操作查询容量容量操作 数据访问下标访问头尾数据访问 数据增删尾插尾删重…

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

在了解缓存雪崩、击穿、穿透这三个问题前,我们需要知道为什么我们需要缓存。在了解这三个问题后,我们也必须知道使用Redis时,如何解决这些问题。 所以我将按照"为什么我们需要缓存"、"什么是缓存雪崩、击穿、穿透"、&qu…

Linux学习笔记 --- Linux基础命令Part1

一. Linux的目录结构 目标:1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道,在操作系统中,文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

如何使用wireShark抓取还原文件

简介 WireShark的追踪流功能可以帮我们抓取从网络上下载的各种文件,接下来就演示下如何抓取并且进行还原。 使用Nginx搭建文件存储服务器 只要是通过http网站下载的包,都可以通过追踪流工具进行抓取。这里为了演示,临时搭建一个Nginx文件存…

Yolov8涨点技巧:MobileViTAttention助力小目标检测,涨点显著,MobileViT移动端轻量通用视觉transformer

在​crack缺陷检测项目原始0.739提升至 0.772 ,涨点明显,博主多个数据集亲测有效,实现暴力涨点; 现有博客都是将MobileViT作为backbone引入Yolov5,因此存在的问题点是训练显存要求巨大,本文引入自注意力的Vision Transformer(ViTs):MobileViTAttention 1. MobileViT介绍…

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一 引言🍉句1: People said my mother was “a good egg”.成分划分弱读连读语调 🍉句2: She would always help anyone in need.成分划分连读语调 🍉句3: We never had to “walk…