设计模式(六)代理模式

相关文章
设计模式系列

1.代理模式简介

代理模式介绍

代理模式也叫委托模式,是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场景有很多,比如代购、代理上网、打官司等。

定义

为其他对象提供一种代理以控制这个对象的访问。

代理模式结构图

  • Subject:抽象主题类,声明真实主题与代理的共同接口方法。
  • RealSubject:真实主题类,定义了代理所表示的真实对象,客户端通过代理类间接的调用真实主题类的方法。
  • ProxySubject:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。
  • Client:客户端类。

2.代理模式的简单实现

假设我要买一个BV的包(博主我很喜欢一直买不起),国内的太贵了,我找了个代购来帮我海外购买,这样能省好多钱,哈哈。

抽象主题类(Subject)

抽象主题类具有真实主题类和代理的共同接口方法,我想要代购,那共同的方法就是购买:

public interface IShop {//购买void buy();
}

真实主题类(RealSubject)

这个购买者LiuWangShu也就是我,实现了IShop接口提供的 buy()方法:

public class LiuWangShu implements IShop {@Overridepublic void buy() {System.out.println("购买");}
}

代理类(ProxySubject)

我找的代理类同样也要实现IShop接口,并且要持有被代理者,在buy()方法中调用了被代理者的buy()方法:

public class Purchasing implements IShop {private IShop mShop;public Purchasing(IShop shop){mShop=shop;}@Overridepublic void buy() {mShop.buy();}
}

客户端类(Client)

public class Client {public static void main(String[] args){//创建LiuWangShuIShop liuwangshu=new LiuWangShu();//创建代购者并将LiuWangShu作为构造函数传IShop purchasing=new Purchasing(liuwangshu);purchasing.buy();}
}

看完客户端类的代码,其实也是很好理解,就是代理类包含了真实主题类(被代理者),最终调用的都是真实主题类(被代理者)实现的方法,在上面的例子就是LiuWangShu类的buy()方法,所以运行的结果就是“购买”。

3.动态代理的简单实现

从编码的角度来说,代理模式分为静态代理和动态代理,上面的例子是静态代理,在代码运行前就已经存在了代理类的class编译文件,而动态代理则是在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。也就是我们在编码阶段不需要知道代理谁,代理谁我们将会在代码运行时决定。Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法。下面我们在上面静态代理的例子上做修改:

创建动态代理类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicPurchasing implements InvocationHandler{private Object obj;public DynamicPurchasing(Object obj){this.obj=obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result=method.invoke(obj, args);return result;}
}

在动态代理类中我们声明一个Object的引用,该引用指向被代理类,我们调用被代理类的具体方法在invoke()方法中执行。接下来我们修改客户端类代码:

import java.lang.reflect.Proxy;
public class Client {public static void main(String[] args){//创建LiuWangShuIShop liuwangshu=new LiuWangShu();//创建动态代理DynamicPurchasing  mDynamicPurchasing=new DynamicPurchasing(liuwangshu);//创建LiuWangShu的ClassLoaderClassLoader loader=liuwangshu.getClass().getClassLoader();//动态创建代理类IShop purchasing= (IShop) Proxy.newProxyInstance(loader,new Class[]{IShop.class},mDynamicPurchasing);purchasing.buy();}
}

4.代理模式的应用

代理模式类型

代理模式的类型主要有以下几点:

  1. 远程代理:为一个对象在不同的地址空间提供局部代表,这样系统可以将Server部分的事项隐藏。
  2. 虚拟代理:使用一个代理对象表示一个十分耗资源的对象并在真正需要时才创建。
  3. 安全代理:用来控制真实对象访问时的权限。
  4. 智能指引:当调用真实的对象时,代理处理另外一些事,比如计算真实对象的引用计数,当该对象没有引用时,可以自动释放它;或者访问一个实际对象时,检查是否已经能够锁定它,以确保其他对象不能改变它。
代理模式使用场景

无法或者不想直接访问某个对象时可以通过一个代理对象来间接的访问。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java EE改名Jakarta EE,jakarta对程序开发的影响

一、前言 很多Java程序员在使用新版本的Spring6或者springboot3版本的时候,发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候,也发展了大量jakarta的工程包。 比如:camunda的webapps编译工程就提供了2种方式javax和jaka…

精准测试探索

一、背景 什么是精准测试?通常研发提测的需求有代码变更,针对研发的代码变更点以及关联点进行测试,我们称之为精准测试。 很多时候,对变更点、影响范围的评估并不是很准确,偶尔会出现影响范围评估不全或者影响范围评…

《Docker 简易速速上手小册》第5章 Docker Compose 与服务编排(2024 最新版)

文章目录 5.1 理解 Docker Compose5.1.1 重点基础知识5.1.2 重点案例:部署 Flask 应用和 Redis5.1.3 拓展案例 1:多服务协作5.1.4 拓展案例 2:使用自定义网络 5.2 编排多容器应用5.2.1 重点基础知识5.2.2 重点案例:部署 Flask 应用…

【Vuforia+Unity】AR05-实物3D模型识别功能实现(ModelTarget )

不管是什么类型的识别Vuforia的步骤基本都是: 把被识别的物体转成图、立体图、柱形图,3D模型、环境模型,然后模型生成Vuforia数据库-导入Unity-参考模型位置开始摆放数字内容,然后参考模型自动隐藏-发布APP-识别生活中实物-数字内容叠加上去! 对于3D物体的识别,可以是虚…

跟着cherno手搓游戏引擎【26】Profile和Profile网页可视化

封装Profile: Sandbox2D.h:ProfileResult结构体和ProfileResult容器,存储相应的信息 #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void OnAttach()ove…

无线综合测试仪8960(E5515C)

无线综合测试仪8960(E5515C) 简述: 8960是美国安捷伦(Agilent)公司生产的手机综测仪,8960测试仪是一款E5515C主机,具有特定于技术的硬件选件和软件应用程序。有两个硬件选项,8960能…

当你使用ChatGPT时,选择合适的提示(prompt)是引导对话方向的关键

马斯克曾说,人生中最重要的事情,就是提出真正的好问题。 因此,我要开始接触某个新领域,并且开始要自主学习的时候,我首先要问自己这个问题: 我为什么要学这个,学这个的目的是为了创造什么&#…

x86使用execve执行一个elf文件并传递参数--代码思路分析

execve(const char *filename, char *const argv[ ], char *const envp[ ]) 视频教程以及实际代码可以看这一个教程 其他的需要的知识 GDT表 GDT表虚拟内存 页表 任务切换 fork实现 elf文件加载 这一个是一个Linux下面的标准接口 这一个的实际作用的是执行一个可执行文件 把当…

网络设备和网络软件

文章目录 网络设备和网络软件网卡交换机交换机的三个主要功能交换机的工作原理第二层交换和第三层交换交换机的堆叠和级联 路由器路由器工作原理 网关网关的分类 无线接入点(AP)调制解调器网络软件 网络设备和网络软件 网卡 网络接口卡又称网络适配器,简称网卡。网…

五种多目标优化算法(MOFA、NSWOA、MOJS、MOAHA、MOPSO)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤: 1. 定义问题:首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数,这些目标函数可能…

conda下tensorflow安装

conda create -n tf21 python3.7 conda activate tf21 conda install tensorflow-gpu2.1验证 import tensorflow as tf tf.test.is_built_with_cuda()

模版(初级)

一.泛型编程 当我们要写一个交换函数时,面对不同的类型,我们可能就需要向如下这么写: void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double tem…