研磨设计模式day11代理模式
目录
场景
代码实现
编辑
解析
定义
代理模式调用示意图
代理模式的特点
本质
编辑何时选用
场景
我有一个订单类,包含订单数、用户名和商品名,有一个订单接口包含了对订单类的getter和setter
现在有一个需求,a创建的订单只能a修改,其他人无权修改
代码实现
定义OrderApi接口
package day10代理模式;public interface OrderApi {public String getProductName();void setProductName(String productName,String user);public String getOrderUser();public void setOrderUser(String orderUser,String user);public int getOrderNum();void setOrderNum(int orderNum,String user);
}
Order类,实现订单接口
package day10代理模式;public class Order implements OrderApi{private String productName;private int orderNum;private String orderUser;public Order(String productName, int orderNum, String orderUser) {this.productName = productName;this.orderNum = orderNum;this.orderUser = orderUser;}@Overridepublic String toString() {return "Order{" +"productName='" + productName + '\'' +", orderNum=" + orderNum +", orderUser='" + orderUser + '\'' +'}';}public void setOrderUser(String orderUser) {this.orderUser = orderUser;}public void setProductName(String productName) {this.productName = productName;}@Overridepublic int getOrderNum() {return orderNum;}@Overridepublic void setOrderNum(int orderNum,String user) {this.orderNum = orderNum;}@Overridepublic String getProductName() {return productName;}@Overridepublic void setProductName(String productName, String user) {this.productName = productName;}@Overridepublic String getOrderUser() {return this.orderUser;}@Overridepublic void setOrderUser(String orderUser, String user) {this.orderUser = orderUser;}
}
现在创建一个代理类
package day10代理模式.java中的代理类;import day10代理模式.Order;
import day10代理模式.OrderApi;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;/*** 使用java中的动态代理*/
public class DynamicProxy implements InvocationHandler {/*** 被代理的对象*/private OrderApi order = null;/*** 获取 绑定好代理和具体对象后的目标对象的 接口** @param order 具体的订单对象,相当于具体目标对象* @return 绑定好代理和具体对象后的目标对象的接口*/public OrderApi getProxyInterface(Order order) {// 设置被代理的对象,好方便invoke里面的操作this.order = order;// 把真正的订单对象和动态代理关联起来OrderApi orderApi = (OrderApi) Proxy.newProxyInstance(order.getClass().getClassLoader(), order.getClass().getInterfaces(), this);return orderApi;}/*** 实现invoke,在这个方法里面,具体判断当前是在调用什么方法,需要如何处理* @param proxy* @param method* @param args* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// System.out.println("用到的方法有什么"+method.getName());System.out.println("args有什么"+ Arrays.toString(args));if (method.getName().startsWith("set")) {System.out.println("进入setter方法了哟");// 如果不是创建人,那就不能修改if (order.getOrderUser() != null && order.getOrderUser().equals(args[1])) {// 可以操作return method.invoke(order,args);}else {
// args[1] 表示第二个才是用户System.out.println("对不起, " + args[1] + ",您无权修改本订单中的数据");}}else if(method.getName().startsWith("to")){System.out.println("现在调用toString方法了哟");return method.invoke(order,args);}else {// 不是调用setter方法就继续执行return method.invoke(order,args);}return null;}}
Client
package day10代理模式;import day10代理模式.java中的代理类.DynamicProxy;public class Client {public static void main(String[] args) {// 1.张三先创建了一个订单Order order = new Order("设计模式", 100, "张三");// 2.创建一个动态代理DynamicProxy dynamicProxy = new DynamicProxy();// 3.将订单与动态代理关联起来OrderApi orderApi = dynamicProxy.getProxyInterface(order);//4.以下就需要使用被代理过的接口来操作了//4.1 李四想要来修改,那就会报错orderApi.setOrderNum(123,"李四");System.out.println("李四修改后的记录==> "+orderApi);//4.2 张三修改orderApi.setOrderNum(123,"张三");System.out.println("张三修改后的记录==> "+orderApi);}
}
解析
代理类首先是实现一个名为InvocationHandler的接口。需要持有被代理对象也就是OrderApi,然后通过一个对外提供的方法将代理与被代理绑定起来。实现invoke方法,这个方法就是为了判断订单接口中当前在使用的方法,对正在使用的方法做什么处理
一行一行解析就是首先判断方法名字是不是set开头的,如果是就看一下订单对象是否为空和这个方法传过来的值中的第1个下标对象是不是等于持有的对象,如果是就可以操作,如果不是就提示。
定义
代理模式调用示意图
代理模式的特点
本质
控制对象访问
何时选用
相关文章:

研磨设计模式day11代理模式
目录 场景 代码实现 编辑 解析 定义 代理模式调用示意图 代理模式的特点 本质 编辑何时选用 场景 我有一个订单类,包含订单数、用户名和商品名,有一个订单接口包含了对订单类的getter和setter 现在有一个需求,a创建的订单只…...

vue2 路由进阶,VueCli 自定义创建项目
一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话,需要给当前跳转的导航加样式,同时要移除上一个a标签的样式,太麻烦!!! 2.解决方案 vue-router 提供了一个全局组件 router…...

《C语言编程环境搭建》工欲善其事 必先利其器
C语言编译器 GCC 系列 GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,常被认为是跨平台编译器的事实标准。原名是:GNU C语言编译器(GNU C Compiler)。 MinGW 又称mingw32 ,…...

蓝蓝设计ui设计公司作品案例-中节能现金流抗压测试软件交互及界面设计
中国节能是以节能环保为主业的中央企业。中国节能以生态文明建设为己任,长期致力于让天更蓝、山更绿、水更清,让生活更美好。经过多年发展,中国节能已构建起以节能、环保、清洁能源、健康和节能环保综合服务为主业的41产业格局,成…...

汽车制造业外发文件时 如何阻断泄密风险?
汽车制造业是我国国民经济发展的支柱产业之一,具有产业链长、关联度高、就业面广、消费拉动大等特性。汽车制造行业景气度与宏观经济、居民收入水平和固定资产投资密切相关。 汽车制造业产业链长,关联度高,汽车制造上游行业主要为钢铁、化工…...

怎么对App进行功能测试
测试人员常被看作是bug的寻找者,但你曾想过他们实际是如何开展测试的吗?你是否好奇他们究竟都做些什么,以及他们如何在一个典型的技术项目中体现价值?本文将带你经历测试人员的思维过程,探讨他们测试app时的各种考虑. …...
数字流的秩、单词频率(哈希实现)
题目1:数字流的秩 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入一个数字都会调用该方法…...

【洛谷】P2678 跳石头
原题链接:https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。(使用二分需要满足两个条件。一个是有界,一个是单调。 这题的题面:使得选手们在比赛过程中…...

Elasticsearch配置优化
以下的优化基础是安装的 Elasticsearch 版本为 7.17.7,同时jdk版本为 1.8.321 1、jvm参数优化 这里说的jvm参数调优,是指elasticsearch安装目录下的jvm.options配置,如下图所示: 这里调整的内容主要是调整垃圾回收的收集器&#…...
Springboot整合minio组件-分布式文件存储
一、快速开始 Minlo说明: Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。Minio主要用来存储非结构化的数据,类似文件,图片,照…...

多态/虚函数/虚函数表
OVERVIEW 多态/虚函数/虚函数表1.虚函数引入后类发生的变化?2.虚函数表的生成时机和生成原因?3.虚函数表指针赋值的时机?4.类对象在内存中的布局?5.虚函数的工作原理和多态性的体现?6.其他问题 多态/虚函数/虚函数表 n…...

QT中按钮的基类QAbstractButton
QT中按钮的基类QAbstractButton 关于控件类的学习方法继承关系信号槽函数标题和图标按钮的 Check 属性 关于控件类的学习方法 控件类很多,API更多,但是不需要记忆知道控件对应的类名,通过帮助文档随用随查优先看帮助文档中控件对应的信号和槽…...
并查集(种类并查集,带权并查集)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都…...

飞天使-k8s基础组件分析-控制器
文章目录 控制器含义解释pod的标签与注释ReplicaControllerReplicaSetDeploymentsDaemonSetJobCronjob参考文档 控制器含义解释 空调遥控器知道吧ReplicationController: ReplicationController确保在任何时候都运行指定数量的pod副本。换句话说,一个ReplicationCo…...

有序充电运营管理平台是基于物联网和大数据技术的充电设施管理系统-安科瑞黄安南
随着我国能源战略发展以及低碳行动的实施,电动汽车已逐步广泛应用,而电动汽车的应用非常符合当今社会对环保意识的要求,以及有效节省化石燃料的消耗。 由于其没有污染排放的优点以及政府部门的关注,电动汽车将成为以后出行的重要…...

LeetCode-227-基本计算器Ⅱ
题目描述: 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意:不允许使用任何将字符串作为数学表达式计…...
dart 学习列表 List
List 列表 在 Dart 编程语言中,List 是一种有序的集合数据类型,用于存储一系列项目。它允许您在单个变量中存储多个项目,并提供了许多操作来管理列表中的数据。以下是关于 Dart 中的 List 的一些重要信息: 创建 List: …...

数据结构--树4.2.1(二叉树)
目录 一、二叉树的存储结构 二、二叉树的遍历 一、二叉树的存储结构 顺序存储结构:二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点,并且结点的存储位置能体现结点之间的逻辑关系。 链式存储结构:二叉树每个结点最多只有两个孩…...

Presto之Driver个数
一. 前言 在Presto的Stage Performace中,每个Operator中都会有Driver个数的显示,如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。 二. Driver个数 在Presto中,一个pipeline中启动多少个Driver,是由此Pipeline处理的S…...

R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化
全文链接:https://tecdat.cn/?p33499 响应面(Response Surface Methodology,RSM)分析是一种常用的统计方法,用于研究和优化生产过程中的影响因素。通过建立数学模型来描述因素与响应之间的关系,RSM可以帮助…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...