代理模式(java)

news2024/11/26 22:23:49

目录

结构

静态代理案例

 代码实现

售票类

火车站类

代理类

测试类

优缺点

优点

缺点


结构

代理(Proxy)模式分为三种角色:

  • 抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。

  • 真实主题(Real Subject)类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

  • 代理(Proxy)类 : 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

静态代理案例

【例】火车站卖票

如果要买火车票的话,需要去火车站买票,坐车到火车站,排队等一系列的操作,显然比较麻烦。而火车站在多个地方都有代售点,我们去代售点买票就方便很多了。这个例子其实就是典型的代理模式,火车站是目标对象,代售点是代理对象。

 代码实现

售票类

package static_proxy;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 售票类
 * @date: 2023/7/20 15:28
 */
public interface SellTickets {
    void sell();
}

火车站类

package static_proxy;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 火车站类
 * @date: 2023/7/20 15:29
 */
public class TrainsStation implements SellTickets {

    @Override
    public void sell() {
        System.out.println("火车站买票");
    }

}

代理类

package static_proxy;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 售票代理
 * @date: 2023/7/20 15:30
 */
public class TicketsProxy implements  SellTickets {

    private final TrainsStation trainsStation = new TrainsStation();

    @Override
    public void sell() {
        System.out.println("收取售票手续费");
        trainsStation.sell();
    }

}

测试类

package static_proxy;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 测试类
 * @date: 2023/7/20 15:27
 */
public class Client {
    public static void main(String[] args) {

        // 实例化代理商
        TicketsProxy proxy = new TicketsProxy();
        // 代理商买票
        proxy.sell();

    }

}

优缺点

优点

  • 代理模式在客户端与目标对象之间起到一个中介作用保护目标对象的作用

  • 代理对象可以扩展目标对象的功能。

  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度

缺点

  • 增加了系统的复杂度。

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

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

相关文章

git cherry-pick 的使用

cherry-pick 精心挑选的意思,即可以从一个分支上挑选一个(或多个)修改,提交到当前分支上,不过 cherry-pick 只能是本地操作,即源分支上必须有的commit 才能 cherry-pick。遇到的情况可能是,源分…

JMeter的使用(2)

JMeter生成测试报告使用的是Ant(Maven)构建工具来生成HTML的测试报告。 ant执行的条件是需要有build.xml的文件的,build.xml文件里面主要编写三个内容: 1、定义了被执行的测试脚本 2、定义了测试报告的目录 3、定义了自动发送邮件 HTTP COOKIE管理器&am…

cgo调用,高效快速稳定,无内存碰撞

一、背景 因为密码学有很多较快的算法是基于c或c纂修,而工程上主要以go语言为主,所以在此梳理一些go调用c常见问题和用例。 有很多奇特的方式进行传输,但是想要性能最优还是以指针传输作为主要传输方式。 一些简单的计算可以直接使用c编写…

Python中数据和JSON互相转换

什么是json JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 。JSON本质上是一个带有特定格式的字符串主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互. 类似于: 国际通…

Apache Struts2漏洞复现之s2-001漏洞复现

0x01 声明: 仅供学习参考使用,请勿用作违法用途,否则后果自负。 0x02 简介: Apache Struts 2是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java ServletAPI,鼓励开发者采用MVC架构…

LeetCode45.Jump-Game-II<跳跃游戏II>

题目: 思路: 从上次大神那里获得的灵感 这题问的是次数,那么我们需要确保 1,能否跳到终点 2,得到次数. 第一次条获得的是nums[0],那么第一个数就是我们第一次能跳跃的范围.每次在范围里获得最大值.并且次数加一.然后进入下一次范围;即可得到次数; 代码…

sql中with as用法/with-as 性能调优/with用法

文章目录 一、概述二、基本语法三、使用场景3.1、定义CTE,并为每列重命名3.2、多次引用/多次定义3.3、with与union all联合使用3.4、with返回多种结果的值3.5、with与insert使用 四、递归查询4.1、语法4.2、使用场景4.2.1、用with递归构造1-10的数据4.2.2、with与insert递归造数…

C++OpenCV(6):图像阈值操作

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 🔆 OpenCV项目地址及源代码:点击这里 文章目录 图像阈值化 图像阈值化 阈值又叫临界值,是指一个效应能够产生的最低值或最高值。 例如我们选择的阈值为125,则…

AI课堂教学质量评估系统算法 yolov7

AI课堂教学质量评估系统通过yolov7网络模型框架利用摄像头和人脸识别技术,AI课堂教学质量评估系统实时监测学生的上课表情和课堂行为。同时,还结合语音识别技术和听课专注度分析算法,对学生的听课专注度进行评估,生成教学质量报告…

SQL与NoSQL数据库选型及实际业务场景探讨

在企业系统架构设计中,选择合适的数据库类型是一项关键决策。本文将对比SQL和NoSQL数据库的特点,分析它们在数据模型、可扩展性、一致性与事务、查询复杂性与频率,以及性能与延迟等方面的优势和劣势。同时,结合轻易云数据集成平台…

专项练习-1数据结构-02字符串

1. 下面关于「串」的叙述中,哪一个是不正确的?( ) A 串是字符的有限序列 B 空串是由空格构成的串 C 模式匹配是串的一种重要运算 D 串既可以采用顺序存储,也可以采用链式存储 正确答案:B 官方解析&…

在vscode中运行Hbuilder创建的项目

想必习惯使用vscode的人突然使用HBuilder很不习惯吧,但是HBuilder创建的项目本身没有调试功能。当你有一个app项目但又不想使用HBuilder编写,需要浏览器调试的时候,你这时就需要一个插件了:uni run 插件 基于HBuilderX的采用unia…

【数据标注】yolo系列中 labelme 标记的 json 文件转 txt 文件保存

在深度学习领域中,数据的标注方式和对应的数据格式确实五花八门。下面是一些常见的标注方式和对应的数据格式: 目标检测标注方式:对于图像目标检测任务,常见的标注方式包括Bounding Box、Mask、Keypoint等。其中, Boun…

Postman怎么做接口测试-以简单的登录接口为例

我们就以登录某测试系统为例子,实现在Postman上做接口测试 一、首先打开系统首页首页,做一个登录操作(目的是获取接口url及参数):一般在公司做接口测试的时候页面还没有出来,我们需要根据接口文档进行接口…

java学习(二):反射

系列文章目录 https://editor.csdn.net/md/?articleId131757340 文章目录 系列文章目录参考【1】注解1. 什么是注解2. 内置注解3. 元注解4.自定义注解 【2】反射--基本概念一、反射的基本概念1. 为什么要用反射?2. 什么是反射?3. 用和不用反射的区别&a…

spring复习:(49)@Configuration配置类上的注解是在哪里被解析的?

主类示例源代码如下: 配置类源码如下: 进入context.register方法: 进入this.reader.register方法: 进入registerBean方法: 进入doRegisterBean方法: 进入AnnotatedGenericBeanDefinition构造方法&am…

计算机科学cs/电子信息ei面试准备——python复习|理解题|简答题

目录 1 请简要概述python技术的主要应用场景? 2 python的基本数据类型是那几种? 3 python数组和列表有什么区别? 4 Python中的函数是什么? 5 请写出删除列表中的元素有几种方式? 6 描述python函数中递归的理解? 7 请介绍join()和split()的区别? 8 介绍…

C++ - 初识vector类 迭代器失效

之前对C当中的string类做了了解和模拟实现: C-string类的模拟实现_chihiro1122的博客-CSDN博客 C string类-2_chihiro1122的博客-CSDN博客 C string类 迭代器 范围for_string类型迭代器_chihiro1122的博客-CSDN博客 vector类使用模版来实现了,我们可…

如何在APP开发中实现无缝用户体验?

我们在日常生活中经常会看到这样一种情况:当我们打开 APP时,有时会出现卡顿、死机的情况,这就是所谓的“死机”现象。在开发 APP时,我们需要考虑用户体验,在用户操作 APP时能够感受到顺畅的使用体验,让用户…

设计模式—1、23种设计模式详解

目录 一、设计模式概述 二、设计模式的分类(总共有 25 种设计模式) 1、创建型模式(5种) 2、结构型模式(8种) 3、行为型模式(12种) 三、设计模式的优点和缺点 1、设计模式的优点…