当前位置:首页 > CN2资讯 > 正文内容

设计模式-代理模式

1天前CN2资讯

模式定义

给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用

为什么使用代理

在不改变目标对象方法的情况下对方法进行增强

代理模式实例

静态代理

先创建一个用户接口(UserInterface),声明一个方法 public interface UserInterface { void service(String s); }

创建实现类(UserImpl)

public class UserImpl implements UserInterface { @Override public void service(String s) { System.out.println("我是" + s); } }

创建代理对象类(UserProxy),通过代理类创建实现类实例并访问其方法

public class UserProxy implements UserInterface { private UserInterface user; public UserProxy(UserImpl user) { this.user = user; } @Override public void service(String s) { System.out.println("检查身份"); user.service(s); System.out.println("请进门"); } }

客户端调用

public class ProxyTest { public static void main(String[] args) { UserImpl user = new UserImpl(); UserProxy proxy = new UserProxy(user); proxy.service("wupx"); } }

输出结果

检查身份 我是wupx 请进门

动态代理

先创建一个User接口

public interface User { void code(); void sleep(); }

创建User的实现类(UserImpl)

public class UserImpl implements User { @Override public void code() { System.out.println("开始敲代码"); } @Override public void sleep() { System.out.println("开始睡觉"); } }

再创建一个代理类(UserImpProxy)

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class UserImpProxy implements InvocationHandler { private User user; public UserImpProxy(User user) { this.user = user; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); Object result; if ("code".equals(methodName)) { System.out.println("讨论需求"); result = method.invoke(user, args); System.out.println("提测"); } else if ("sleep".equals(methodName)) { System.out.println("洗澡"); result = method.invoke(user, args); } else { result = method.invoke(user, args); } return result; } }

去测试动态代理

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args) { UserImpl user = new UserImpl(); InvocationHandler userProxyHandler = new UserImpProxy(user); User userProxy = (User) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), userProxyHandler); userProxy.code(); userProxy.sleep(); } }

运行结果

讨论需求 开始敲代码 提测 洗澡 开始睡觉

总结

使用Java动态代理的两个重要步骤

1.通过实现 InvocationHandler 接口创建自己的调用处理器; 2.通过为Proxy类的newProxyInstance方法指定代理类的ClassLoader 对象和代理要实现的interface以及调用处理器InvocationHandler对象来创建动态代理类的对象;

武培轩 有帮助?在看,转发走一波 喜欢作者

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24885.html

    分享给朋友:

    “设计模式-代理模式” 的相关文章

    中国电信CN2宽带套餐怎么样?高速稳定的上网体验就在身边

    在这个数字化时代,优质的宽带网络已经成为每个家庭和企业不可或缺的一部分。而中国电信CN2宽带套餐,正是为满足用户对高速、稳定、智能的网络需求而推出的全新解决方案。无论是日常浏览、在线办公,还是高清视频娱乐,CN2宽带都能为用户提供卓越的上网体验。中国电信CN2宽带套餐的最大亮点在于其高速稳定的特点。...

    VPS是干嘛用的:解析虚拟专用服务器的优势与应用

    在当今互联网的快速发展下,VPS(Virtual Private Server,虚拟专用服务器)逐渐成为了个人和企业首选的主机类型。简单来说,VPS就是一种将物理服务器分割成多个虚拟服务器的技术。每个虚拟服务器都能独立运行操作系统,用户可以自由管理自己的环境,就像拥有一台独立的服务器一样。VPS通过...

    如何将800G硬盘进行有效分区

    在我们深入探讨硬盘分区之前,理解硬盘分区的概念非常重要。硬盘分区是将一个物理硬盘划分为多个独立部分的过程。每个分区就像独立的小仓库,可以用来存储不同类型的数据,比如系统文件、应用程序、甚至个人文件。当我第一次接触硬盘的时候,就被这个划分方法吸引住了。不仅能帮助我更好地管理和查找文件,还能提高系统的运...

    APT攻击是什么及其防御措施详解

    APT攻击(Advanced Persistent Threat,高级持续性威胁)是一种复杂而长期的网络攻击模式。在我了解这个概念的过程中,逐渐意识到它不仅仅是一种攻击手段,而是一个精密的、组织化的网络战争策略。APT攻击的敌对方通常具备高超的技术能力和丰富的资源,他们的目标是破坏组织的核心设施,或...

    全面解析UDP攻击:类型、影响及有效防御策略

    在当今网络环境中,UDP攻击是一个话题无法忽视的安全隐患。它是一种常见的网络攻击形式,通常会给目标服务器带来严重的资源消耗。为了更好地理解这一现象,我们不妨简单回顾一下UDP协议的特性,以及攻击者是如何利用这一协议实施攻击的。 UDP,即用户数据报协议(User Datagram Protocol)...

    阿里云优惠券使用指南 - 如何获取和利用阿里云优惠券

    在当今数字化快速发展的情况下,越来越多的企业和个人选择迁移到云端,以提高业务效率和降低运营成本。而在众多云服务提供商中,阿里云以其领先的技术和丰富的服务,赢得了广泛的用户基础。在这个过程中,阿里云优惠券成为了降低上云成本的重要工具。 阿里云的优惠券种类繁多,针对不同用户群体提供了各种适合的优惠方案。...