设计模式-代理模式 /动态代理
创始人
2025-05-28 04:51:28
0

proxy模式的核心

proxy是代理人的意思,编程当中,指的是创建代理人和本人两个对象,只有代理人无法完成的工作才会交给本人完成。其他工作都由代理人自己完成。

Proxy模式中的登场角色

subject(主体)

subject角色定义了Proxy角色(代理人)和RealSubject角色(一致)接口。由于存在Subject接口(Proxy、RealSubject都为Subject接口的实现类),所以客户端角色不必在意使用的是proxy角色还是RealSubject角色。

public interface Printable {public abstract void setPrinterName(String name);public abstract String getPrinterName();public abstract void print(String printString);
}

proxy(代理人)

proxy角色会尽量处理来自client角色的请求,只有当自己不能处理时,她才会将工作交给RealSubject角色。Proxy角色只有在必要时才会生成RealSubject角色。Proxy为Subject接口的实现类。

public class PrinterProxy implements Printable {private String printerName;// 被代理对象 Printerprivate Printer printer;public PrinterProxy() {}public PrinterProxy(String printerName) {this.printerName = printerName;}@Overridepublic synchronized void setPrinterName(String name) {if (printer != null) {printer.setPrinterName(name);}printerName = name;}@Overridepublic String getPrinterName() {return printerName;}@Overridepublic void print(String printString) {realize();printer.print(printString);}private synchronized void realize() {if (printer == null) {printer = new Printer();printer.setPrinterName(printerName);}}
}

RealSubject(实际的主体)

RealSubject为Subject接口的实现类。只有Proxy处理不了任务时实现。
实际主体即printer在实例时需要比较长的时间,因此仅需要进行实例化的时候才对其进行实例化。即仅需要使用print功能的时候,才实例化printer。

public class Printer implements Printable {private static final String TAG = "JJWorld Printer";private String name;public Printer() {heavyJob( "printer实例生成中");}public Printer(String name) {this.name = name;heavyJob(name + "的printer实例生成中");}@Overridepublic void setPrinterName(String name) {this.name = name;}@Overridepublic String getPrinterName() {return name;}@Overridepublic void print(String printString) {Log.i(TAG,"************"  + name + "************");Log.i(TAG,"************" + printString + "************");}private void heavyJob(String msg){Log.i(TAG,msg);for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);}catch (Exception e){}Log.i(TAG,".");}Log.i(TAG,"******************end******************");}
}

client(实际的主体)

使用Proxy模式的角色。并不包含在Proxy中。

public class MainActivity extends Activity {private static final String TAG = "JJWorld MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {Printable printer = new PrinterProxy();printer.setPrinterName("虚空大帝");Log.i(TAG,printer.getPrinterName());printer.print("虚空一生不弱于人");printer.setPrinterName("无始大帝");Log.i(TAG,printer.getPrinterName());}}).start();}
}

静态代理

程序执行之前编写好执行类的代理类。

动态代理

在程序执行过程中,使用jdk的反射机制,创建代理类对象,并动态的制定要代理目标类。

通过反射自动生成代理对象。

案例1

通过重写invoke方法,当targetObj的方法执行前后,执行

Log.i(TAG,"开始执行");
Log.i(TAG,"结束执行");

打印日志操作。

代理类

public class DynamicProxy implements InvocationHandler {private static final String TAG = "JJWorld.DynamicProxy";private Object targetObj;@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Log.i(TAG,"开始执行");Object invoke = method.invoke(targetObj,args);Log.i(TAG,"结束执行");return invoke;}/*** 动态代理对象实例*/public Object getInstance(Object targetObj){this.targetObj = targetObj;return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(),this);}}

使用类

public class MainActivity extends Activity {private static final String TAG = "JJWorld MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {List dynamicProxyList = (List)new DynamicProxy().getInstance(new ArrayList());dynamicProxyList.add("hello world");}}).start();}
}

输出结果

可见,在add方法的前后都加上了打印日志操作

2023-03-14 11:03:43.456 32540-332/cn.jj.project2 I/JJWorld.DynamicProxy: 开始执行
2023-03-14 11:03:43.456 32540-332/cn.jj.project2 I/JJWorld.DynamicProxy: 结束执行

相关内容

热门资讯

kubernetes核心组件原... 文章目录核心组件原理1、RC[控制器]2、RS[控制器]3、Deployment4、HPA5、Sta...
华为OD机试 - 数组组成的最... 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真...
java.sql.Time 字... 项目场景: 情况:最近有一个很奇怪的事情,项目已经上线了一...
一文读懂!跨境支付业务详解 随着全球电子商务的增长,面向进出口贸易的跨境支付应运而生。据华创微课统计,...
MySQL的隐式类型转换 引入 在项目中调用别的部门的模糊查询接口,发现还根据模糊字段搜索主键,还...
redis教程3 (特性以及五... redis 特性以及五种数据类型的编码特点适用场景redis特性优势(快)...
理解 zk-SNARKs 和 ... SNARK 和 STARK 是零知识证明技术,允许一方在不透露任何进一步信息的情况下向...
【JavaSE】继承的详解 前言 大家好,我是那个不会打拳的程序猿。今天我给大家带来的是面向对象之封装继承多态中...
Delta并联机械臂实现电磁铁... 1. 功能说明 本文示例将利用Delta并联机械臂实现不同点定点搬运磁铁物料的效果。  2. 结构...
高标准农田信息化监测系统解决方... 一、方案背景 《中共中央国务院关于做好2023年全面推进乡村振兴重点工作的意见》指出,...
从0开始实现java Stre... java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式...
Windows_安装整合Pro... 安装包下载 prometheus windows_exporter pushgateway graf...
【递归】N皇后问题用代码解决 目录 一、概述 ·N皇后问题是什么? ·怎么解决该问题? 二、C+...
嵌入式学习笔记——STM32的... STM32的中断控制体系前言STM32中断的概念中断类型中断控制常用控制函数区分中断源与中断信号配置...
Unity 编辑器开发 编辑器开发基本有四个 1 UnityEngine.GUI2 UnityEngine.GUILayou...
【深度强化学习】(6) PPO... 大家好,今天和各位分享一下深度强化学习中的近端策略优化算法(proxim...
Android 系统开发中如何... 这篇文章主要介绍“Android 系统开发中如何在后台实现多线程”,在日常操作中&#x...
JavaWeb学习-Cooki... Cookie Cookie是servlet发送到Web浏览器的少量信息,该信息由浏览器...
基于PP-YOLOE-SOD实... 本项目基于百度飞桨AI Studio平台进行实现,百度出品的深度学习平台飞桨ÿ...
文件丢失了怎么能复原   文件丢失了怎么能复原?在你使用电脑的时候,有没有遇到过文件突然就丢失的情况。虽然这...