代理模式【Proxy Pattern】

news2024/11/26 6:12:06
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道
被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被
代理的人能干活呀。
举例子:
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理
类图如下

(1).静态代理

  1. 定义同一种类型的接口
  2. 定义同一种类型接口的实现
  3. 定义代理类

 1.先定义一种类型的女人:

package proxy;

/**
 * * 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
 *
 * @author 1
 * @version 1.0
 * @description: TODO
 * @date 2023/8/14 14:43
 */
public interface KindWomen {
    /**
     * 抛媚眼
     */
    public void makeEyesWithMan();

    /**
     * 开心约会
     */
    public void happyWithMan();

}

2.实现接口

package proxy;

/**
 * 潘金莲
 *
 * @author 1
 * @version 1.0
 * @description: TODO
 * @date 2023/8/14 14:45
 */
public class PanJinLian implements KindWomen {
    @Override
    public void makeEyesWithMan() {
        System.out.println("潘金莲抛媚眼");
    }

    @Override
    public void happyWithMan() {
        System.out.println("潘金莲和男人开心约会");
    }
}

3.定义代理类

package proxy;

/**
 * 代理类
 * 王婆(帮忙给西门庆代理)
 *
 * @author 1
 * @version 1.0
 * @description: TODO
 * @date 2023/8/14 14:46
 */
public class WangPo implements KindWomen {
    private KindWomen kindWomen;

    /**
     * 王婆默认就是潘金莲的代理
     */
    public WangPo() {
        this.kindWomen = new PanJinLian();
    }

    /**
     * 王婆可以代理这个类型的所有人
     *
     * @param kindWomen
     */
    public WangPo(KindWomen kindWomen) {
        this.kindWomen = kindWomen;
    }

    @Override
    public void makeEyesWithMan() {
        //实际做事的是代理类
        this.kindWomen.makeEyesWithMan();
    }

    @Override
    public void happyWithMan() {
        //实际做事的是代理类
        this.kindWomen.happyWithMan();
    }
}

4.找到代理类进行调用

package proxy;

/**
 * 西门庆
 *
 * @author 1
 * @version 1.0
 * @description: TODO
 * @date 2023/8/14 14:50
 */
public class XiMenQing {
    public static void main(String[] args) {
        System.out.println("(1)静态代理******************");
        //西门庆找到王婆,然后王婆就作为代理,帮忙安排了和潘金莲的约会
        WangPo wangPo = new WangPo();
        //王婆默认的代理就是潘金莲
        wangPo.makeEyesWithMan();
        wangPo.happyWithMan();

        //传参数执行
        WangPo wangPo2 = new WangPo(new PanJinLian());
        wangPo2.makeEyesWithMan();
        wangPo2.happyWithMan();



        System.out.println("(2)动态代理******************");
        KindWomen kindWomen = (KindWomen)new ProxyFactory(new PanJinLian()).getProxyInstance();
        System.out.println("生成的代理对象"+kindWomen.getClass());
        kindWomen.makeEyesWithMan();
        kindWomen.happyWithMan();



    }
}

(2).动态代理

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 1
 * @version 1.0
 * @description: TODO
 * @date 2023/8/14 14:58
 */
public class ProxyFactory {
    //维护一个目标对象 , Object
    private Object target;
    //构造器 , 对target 进行初始化
    public ProxyFactory(Object target) {
        this.target = target;
    }
    //动态生成一个代理对象
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() { //匿名类重写invoke方法
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("动态代理开始");
                        Object returnVal = method.invoke(target, args);//反射机制调用目标对象的方法
                        System.out.println("动态代理结束");
                        return returnVal;
                    }
                });
    }
}

执行结果如下:

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

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

相关文章

数据结构与算法-链表(含经典面试题)

一 面试经典: 1. 如何设计一个LRU缓存淘汰算法?基础 思想:新加的点来了, 首先去链表里面遍历,如果找到了。删掉 然后插入到头部。头部就是最新的吧如果不在原来的链表里:如果有空间就插入头部。LRU有内存限制的&#x…

理解 Go 中的切片:append 操作的深入分析(篇2)

理解 Go 语言中 slice 的性质对于编程非常有益。下面,我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 2 篇,当切片的容量 cap 不够时 func main() {// slice1 当前长度为 3,容量大小也为 3slice1 :…

探索Python中的函数和类:构建模块化和面向对象的程序

文章目录 🍀引言🍀函数:模块化编程的基石🍀类:面向对象编程的基石🍀函数和类的结合:构建高效的程序🍀简单的文字冒险游戏 🍀引言 Python作为一种多范式的编程语言&#x…

web图书管理系统Servlet+JSP+javabean+MySQL图书商城图书馆 源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 web图书管理系统ServletJSPjavabeanMySQL 系统有1权限…

用于100GB+、TB级大型数据集构建【2】--计算包Xarray-主要数据类型

引言: Xarray是一个性能出众的张量操作库,通常用于多通道的时间序列信号处理(比如传感器信号)。通常,在处理此类数据时,我认为您经常使用numpy的np.ndarray。但是,由于np.ndarray是一个简单的矩…

[保研/考研机试] KY103 2的幂次方 上海交通大学复试上机题 C++实现

题目链接: KY103 2的幂次方 https://www.nowcoder.com/share/jump/437195121691999575955 描述 Every positive number can be presented by the exponential form.For example, 137 2^7 2^3 2^0。 Lets present a^b by the form a(b).Then 137 is present…

Linux设备树详解

Linux 设备树详解 Linux 操作系统早期是针对个人电脑设备而开发的操作系统,而个人电脑处理器产商较为单一(例如只有 Intel,AMD)同时个人电脑产商均使用 Intel 或 AMD 制造的处理器,业界形成了统一的总线/硬件接口标准…

稀疏感知图像和体数据恢复的系统对象研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

目录 1、想达到的效果2、用户信息在微服务之间传递的两种途径3、用RuoYi-Cloud为例进行演示说明(1)网关将用户信息写在请求头中(2)业务微服务之间通过OpenFeign进行调用,并且将用户信息写在OpenFeign准备的请求头中&am…

02:STM32--EXTI外部中断

目录 一:中断 1:简历 2:AFIO 3:EXTI ​编辑 4:NVIC基本结构 5:使用步骤 二:中断的应用 A:对外式红外传感计数器 1:连接图​编辑 2:函数介绍 3:硬件介绍 4:计数代码 B;旋转编码计数器 1:连接图 2:硬件介绍 3:旋转编码器代码: 一:中断 1:简历 中断:在主程…

硬件产品经理:从入门到精通(新书发布)

目录 简介 新书 框架内容 相关课程 简介 在完成多款硬件产品从设计到推向市场的过程后。 笔者于2020年开始在产品领域平台输出硬件相关的内容。 在这个过程中经常会收到很多读者的留言,希望能推荐一些硬件相关的书籍或资料。 其实,笔者刚开始做硬…

电力能源管理系统在生物制药行业的应用

安科瑞 华楠 摘要:根据生物制品类企业的电力能源使用特点,制定了符合公司实际情况的能源管理系统,介绍了该系统的架构及其在企业的应用情况,提升了公司能源数据的实时监控能力,优化了公司能源分配,降低了公…

React Native Expo项目,复制文本到剪切板

装包: npx expo install expo-clipboard import * as Clipboard from expo-clipboardconst handleCopy async (text) > {await Clipboard.setStringAsync(text)Toast.show(复制成功, {duration: 3000,position: Toast.positions.CENTER,})} 参考链接&#xff1a…

接口自动化测试,Fiddler使用抓包辅助实战,一篇彻底打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、快捷设置&…

GaussDB数据库SQL系列-UNION UNION ALL

目录 一、前言 二、GaussDB UNION/UNION ALL 1、GaussDB UNION 操作符 2、语法定义 三、GaussDB实验示例 1、创建实验表 2、合并且除重(UNION) 3、合并不除重(UNION ALL) 4、合并带有WHERE子句SQL结果集(UNION ALL) 5、…

ansible的playbook剧本

playbook剧本 PlayBook1.playbooks 本身由以下各部分组成2.示例:3.运行playbook补充参数: 4.定义、引用变量5.指定远程主机sudo切换用户6.when条件判断7.迭代8.Templates 模块1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量2…

9.3.2.2网络原理(传输层TCP)

TCP全部细节参考RFC标准文档 一.TCP特点: 有连接,可靠传输,面向字节流,全双工. 二.TCP数据报: 1.端口号是传输层的重要概念. 2.TCP的报头是变长的(UDP是固定的8字节),大小存在4位首部长度中,用4个bit位(0~15)表示长度单位是4字节.(TCP报头最大长度是60字节,前面20字节是固定…

VR时代真的到来了?

业界对苹果的期待是,打造一台真正颠覆性的,给头显设备奠定发展逻辑底座的产品,而实际上,苹果只是发布了一台更强大的头显。 大众希望苹果回答的问题是“我为什么需要一台AR或者VR产品?”,但苹果回答的是“…

数据结构—图的应用

6.4图的应用 概念回顾—生成树 生成树:所有顶点均由边连接在一起,但不存在回路的图。 一个图可以有许多棵不同的生成树、含有n个顶点 n-1 条边的图不一定是生成树所有生成树具有以下共同特点 生成树的顶点个数与图的顶点个数相同;生成树是图的…

【正点原子STM32连载】第四章 APM32初体验摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第四…