设计模式之代理模式(上) 静态代理与JDK动态代理

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

代理模式

  • 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

静态代理

静态代理是由我们编写好的类,在程序运行之前就已经编译好的的类,此时就叫静态代理。 说理论还是比较懵逼的,直接上代码:

抽象主题,可以想象成我们的业务接口。

/*** 抽象主题。* @author wushuaiping* @date 2018/3/13 下午10:13*/
public interface ISubject {/***  比如现在有个业务功能,需要开启某项校验。*/void enableCheck();
}

真实主题,可以想象成我们对业务接口的实现类。

/***  真实主题* @author wushuaiping* @date 2018/3/13 下午10:21*/
public class RealSubject implements ISubject {public void enableCheck() {System.out.println("我开启了某项校验~~");}
}

但是有一天,我突然想加个日志记录,但是我不想去改动原有的方法。那么我们就可以使用这种方式:

/***  代理类* @author wushuaiping* @date 2018/3/13 下午10:23*/
public class ProxySubject implements ISubject{private ISubject subject;public ProxySubject(ISubject subject){super();this.subject = subject;}// 对被代理对象的方法进行增强public void enableCheck() {before();subject.enableCheck();after();}private void before(){System.out.println("我记录一下启动校验前的相关日志。");}private void after(){System.out.println("我记录一下启动校验后的相关日志。");}
}

我们使用静态代理后,来试试看这种方式能不能行?测试代码:

public class Main{public static void main(String[] args) throws ApiException {ProxySubject proxy = new ProxySubject(new RealSubject());proxy.enableCheck();}
}

运行结果:

我记录一下启动校验前的相关日志
我开启了某项校验~~
我记录一下启动校验后的相关日志。

静态代理模式相对比较简单,但是缺点肯定也是有的:

  1. 一个代理对象只能服务于一个类。如果有很多类需要记录日志的话,你的一个一个去实现。。累不死你。。

  2. 代理对象必须实现接口,如上。一个字:还是累。

动态代理

这里动态代理使用的是JDK的动态代理实现的,JDK的动态代理必须是目标对象实现接口才可以。也就是相当于我们上面的业务实现类(RealSubject)。使用CGLIB就不用实现接口也可完成动态代理,但是今天时间不多了,明天还得搬砖,所以先把JDK动态代理学了,明天再学学CGLIB的动态代理。 代码如下:

要实现动态代理;需要先去实现InvocationHandler接口,这个接口提供了invoke方法,该方法相信用过反射或者AOP的同学应该都比较熟悉,我这里就不多讲了。实现了这个后我们可以调用目标方法了,但是我们需要代理的对象还不知道从何而来,所以我们还需要使用JDK提供的Proxy.newProxyInstance方法,第一个参数是目标代理类的类加载器,第二个参数是目标代理类实现的接口,第三个参数的话是目标代理类的调用处理程序就是InvokeHandler啦。用该方法可以生产代理对象。

/***  使用Java的动态代理实现* @author wushuaiping* @date 2018/3/13 下午10:43*/
public class DynamicProxy implements InvocationHandler {private Object target;public Object getProxyInstance(Object target){this.target = target;// 使用Java的获取代理实例方法来获取代理实例。。好绕啊。。反正就是获取代理实例-_-return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}// 增强, 调用目标方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before();// 因为我们需要被增强的方法enableCheck是没有返回参数的,所以不需要返回值。// 如果有返回值 Object res = method.invoke(proxy, args); return res;就可以了method.invoke(target, args);after();return null;}private void before(){System.out.println("操作之前的日志记录~~");}private void after(){System.out.println("操作之后的日志记录~~");}
}

Test case

public static void main(String[] args) throws ApiException {DynamicProxy proxy = new DynamicProxy();ISubject subject = (ISubject)proxy.getProxyInstance(new RealSubject());subject.enableCheck();}

运行结果:

操作之前的日志记录~~
我开启了某项校验~~
操作之后的日志记录~~

今天的设计模式算是学完啦,抽象工厂模式感觉我可能思维不够抽象,所以到现在还没能理解抽象工厂模式到底能干嘛?实际中有何用处?本文用于个人学习记录,有写的不好的地方,还请各位大佬指点一二!

good night!

转载于:https://my.oschina.net/u/3152087/blog/1634283

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

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

相关文章

WPF 实现更换主题色

WPF 实现更换主题色WPF 使用 WPFDevelopers.Minimal 如何更换主题色作者:WPFDevelopersOrg原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal框架使用大于等于.NET40;Visual Studio 2022;项目使用 MIT 开源许可协议&a…

vue3与vue2的区别

先来说说当下市场开发使用的问题,目前2021年使用vue3开发的企业还是少,基本上都还是以vue2的形式进行开发,vue3的开发模式跟react很像,这时候有人就会想那我学vue3有用么,淦,他喵的,先别激动&am…

Spring Data REST API集成Springfox、Swagger

原文: Documenting a Spring Data REST API with Springfox and Swagger 使用Spring Date REST,你可以迅速为Spring Date repositories的创建REST API,并提供CRUD和更多功能。然而,在严谨的API开发过成功,您还希望拥有自动生成的最…

【系统设计】S3 对象存储

在本文中,我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务。S3 是 Amazon Web Services (AWS) 提供的一项服务, 它通过基于 RESTful API 的接口提供对象存储。根据亚马逊的报告,到 2021 年,有超过 100 万…

转: telnet命令学习

1.每天一个linux命令(58):telnet命令 转自: http://www.cnblogs.com/peida/archive/2013/03/13/2956992.html telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员&a…

禅道、码云、coding、redmine、jira、teambition几大敏捷开发项目管理系统试用对比体验

作为一个软件公司的管理人员,在项目和人员多起来后,就需要通过系统来对项目和人员进行管理。 我们是典型的软件外包公司,专为客户定制软件,所以我们的业务都是项目型的。因此,在管理模式上,我们就要用所谓…

Dubbo中的SPI机制

Dubbo中的SPI机制 概述 Service Provider Interface 即 SPI,是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件。可以让不同的厂商针对统一接口编写不同的实现 SPI实际上是“接口策略模式配置文件”实现的动态加载机制。在系统设计中&…

JWT:拥有我,即拥有权力

Hi,这里是桑小榆。上篇文章中,我们一起探讨了 OAuth 协议的原理以及授权认证流程,本次我们一起探讨 jwt 令牌作为授权协议的传输介质。OAuth协议规范了几个参与角色的授权标准,安全可控的授予第三方应用,第三方应用获取…

双十一到来之前,阿里AI设计师“鲁班”1天能做4000万张海报

相比较去年,“鲁班”的设计技艺有所提升。 人工智能很大程度上便利了我们的生活,现在他们甚至还能取代了一些设计师的工作,在双十一正式到来之前,淘宝的宣传已经铺天盖地,然而很多人都没想到,我们打开淘宝…

Appium移动自动化测试之获取appPackage和appActivity

方法一:直接打开Appium,点击左上角机器人图标 选择apk所在位置,如图所示,这里以ContactManager.apk为例 方法二:利用dex2jar和jd-gui这两个工具反编译apk文件 这里仍以ContactManager.apk为例 (1)重命名ContactManager.apk为Conta…

CAD转WPF: 关于CAD图纸文件转换为WPF矢量代码文件(xaml文件)的技巧

前言:下面的文章,我将会以几个很简单的步骤,来演示一下通过CAD图纸转换为XAML代码文件的方法,供大佬们参考。一、为了演示一个简单的操作,我此处先打开一个空白的CAD,等下用来进行绘制点内容使用。二、自定…

python之新式类与经典类

经典类与新式类经典类:P 或 P()--深度查找,向上查父节点新式类 :P(object)---广度查找,继承object,新式类的方法较多转载于:https://www.cnblogs.com/zyy98877/p/8574983.html

Flowportal-BPM——环境配置

环境配置: 一、控制面板→程序和功能→打开或不关闭Window功能→选择选项 二、控制面板→管理工具→Internet信息服务(IIS)管理器→左侧第一个→ISAPI和CGI限制→全部选为【允许】 三、控制面板→管理工具→Internet信息服务(IIS&…

一篇文章带你搞懂什么是DevOps?

DevOps DevOps 它的英文发音是 /de’vɒps/,类似于“迪沃普斯”,一词本身是对于 development 以及 operation 两个词的混合,其目的在于缩短系统开发的生命周期,在这过程中发布特性、修复bug以及更新均被紧密的结合。 简化的含义为…

微服务架构下分布式事务解决方案 —— 阿里GTS

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。Hailo有160个不同服务构成&…

重要消息丨.NET Core 3.1 将于今年12月13日结束支持

点击上方蓝字关注我们(本文阅读时间:5分钟).NET Core 3.1 将于 2022 年 12 月 13 日结束支持。此后,Microsoft 将不再为 .NET Core 3.1 提供服务更新或技术支持。我们建议尽快迁移到 .NET 6。如果您在支持日期结束后仍在使用 .NET Core 3.1&a…

产品设计的三大原则

1.它有用吗? 如果我们必须从这三个特性中选择一个作为最重要的,那就是有用性。 首要的是,一个产品必须有用。如果它无用,其它任何东西都是不相关的,因为没有人会需要它。很明显,有用性和可享用性看上去一样重要&#…

常用的17个运维监控系统

1. Zabbix Zabbix 作为企业级的网络监控工具,通过从服务器,虚拟机和网络设备收集的数据提供实时监控,自动发现,映射和可扩展等功能。 Zabbix的企业级监控软件为用户提供内置的Java应用服务器监控,硬件监控&#xff0c…

关于html-三角的制作

因为最近看到别人写的不错的样式,所以就想自己实现,但是呢用到了一个三角形,所以稍微研究一下。效果是这样的:注意是下边那个浅色三角,感觉书签的效果有木有。看着很有层次感。接下来就是实现了,利用border…

ABP中的数据过滤器

本文首先介绍了ABP内置的软删除过滤器(ISoftDelete)和多租户过滤器(IMultiTenant),然后介绍了如何实现一个自定义过滤器,最后介绍了在软件开发过程中遇到的实际问题,同时给出了解决问题的一个未必最优的思路。一.预定义过滤器ABP中的数据过滤…