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

十一、代理模式(Proxy)proxy代理

2天前CN2资讯

​​​​​


一、什么是代理模式

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


二、代理模式中的角色

    1、Subject(抽象主题角色): 定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy。

    2、RealSubject(真实主题角色):定义Proxy所代表的真实实体。

    3、Proxy(代理主题角色):保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。


三、代理模式类图

        


四、代理模式代码(静态代理)

    1、Subject

//公共接口
public interface Subject {

void request();

}

    2、RealSubject

public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject Request...");
}
}

    3、Proxy

//代理对象
public class Proxy implements Subject {

private RealSubject realSubject;

@Override
public void request() {
if (realSubject == null){
realSubject = new RealSubject();
}
before();
realSubject.request();
after();
}

public void before(){
System.out.println("Proxy before...");
}

public void after(){
System.out.println("Proxy after...");
}
}

    4、客户端

public class MainClass {

public static void main(String[] args) {
Subject proxy = new Proxy();
proxy.request();
}
}


五、JDK动态代理

   Jdk的动态代理,是使用反射技术获得类的加载器并且创建实例,根据类执行的方法在执行方法的前后发送通知。在代理对象Proxy的新建代理实例方法中,必须要获得类的加载器、类所实现的接口、还有一个拦截方法的句柄。在句柄的invoke中如果不调用method.invoke则方法不会执行。在invoke前后添加通知,就是对原有类进行功能扩展了。缺点,被代理类必须实现接口。

Subject和RealSubject还是使用上面的,其他代码如下:

public class MainClass {

public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
MyHandler myHandler = new MyHandler();
myHandler.setRealSubject(realSubject);
//获得代理对象
Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), myHandler);
proxy.request();
}
}

class MyHandler implements InvocationHandler {
//真实对象的引用
private Object object;

public void setRealSubject(Object object) {
this.object= object;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(object, null);
after();
return result;
}

public void before(){
System.out.println("Proxy before...");
}

public void after(){
System.out.println("Proxy after...");
}

}


六、Cglib动态代理

   利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。因为是生成被代理类的子类,所以被代理类不能用final修饰。

被代理类:没有实现接口

public class RealSubject {

public void request() {
System.out.println("RealSubject Request...");
}
}

CglibProxy:

public class CglibProxy implements MethodInterceptor {

//维护目标对象
private Object target;

public CglibProxy(Object target) {
this.target = target;
}

//给目标对象创建一个代理对象
public Object getProxyInstance(){
//1.工具类
Enhancer en = new Enhancer();
//2.设置父类
en.setSuperclass(target.getClass());
//3.设置回调函数
en.setCallback(this);
//4.创建子类(代理对象)
return en.create();

}

@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
before();
Object result = method.invoke(target, objects);
after();
return result;
}

public void before(){
System.out.println("Cglib before...");
}

public void after(){
System.out.println("Cglib after...");
}
}

客户端:

public class MainClass {

public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy(new RealSubject());
RealSubject proxyInstance = (RealSubject) cglibProxy.getProxyInstance();
proxyInstance.request();
}
}


    你可能想看:

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

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

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

    分享给朋友:

    “十一、代理模式(Proxy)proxy代理” 的相关文章

    欧洲VPSCN2超级VPS管理器:高效、稳定、智能的云端解决方案

    欧洲VPSCN2超级VPS管理器:重新定义云端管理在快速发展的互联网时代,VPS(虚拟专用服务器)因其高效、灵活和低成本的特点,成为了许多企业及个人用户的首选解决方案。随着业务规模的扩大和需求的多样化,传统的VPS管理方式逐渐显现出诸多不足:服务器资源分配不均、网络延迟高、运维成本高昂等问题成为用户...

    JustHost优惠码大揭秘:节省开支的绝佳办法

    JustHost概述 我对JustHost的了解始于它的多样化主机产品和用户友好的服务。JustHost成立于2006年,作为一家俄罗斯主机商,它提供虚拟主机、VPS服务器以及独立服务器,是一个值得关注的选择。JustHost不仅拥有丰富的技术背景,还致力于为用户提供高性价比的服务,这让我对它充满了...

    为小学生选择合适的VPS:安全、易用和高性价比的评测指南

    在这个数字化时代,网络安全受到越来越多人的重视。小朋友们在网络上探索新知识、与朋友沟通时,面对的不仅是丰富的学习资源,还有潜在的网络风险。此时,VPS(虚拟个人服务器)作为一个安全、稳定的网络环境,开始逐渐进入小学生的视野。家长和学校意识到,提供一个良好的网络环境,不仅能保护孩子免受不良信息的侵害,...

    甲骨文云免费申请详解:轻松获取免费云服务

    甲骨文云免费申请概述 当提到云服务的时候,甲骨文云绝对是一个值得关注的选项。甲骨文云(Oracle Cloud)是一项提供强大基础设施和服务的云计算平台,尤其在数据管理、分析和应用开发方面具有突出的优势。在这个日益数字化的时代,免费试用计划让用户能够亲自体验甲骨文云的强大功能,激起了很多人的好奇和兴...

    选择台湾VPS的优势与实用技巧分析

    在当今互联网迅速发展的时代,虚拟专用服务器(VPS)成为了众多企业和个人不二的选择。台湾VPS作为一个相对新兴的产品,凭借自己独特的地理位置和优异的技术性能,逐渐在市场上占据了一席之地。身为个人或企业,在选择服务器时,了解台湾VPS的基本概念及其优势无疑是一个明智的开始。 什么是VPS? VPS,即...

    2023年美国服务器市场分析与未来展望

    在美国,服务器市场一直以来都具有举足轻重的地位。到了2023年,这个市场依旧保持着强劲的增长势头。根据IDC的分析报告,2023年第一季度,美国的服务器市场规模达到了2212亿美元,相比去年增长了2%。这不仅显示了市场的健康发展,也奠定了美国在全球服务器市场的领导地位,全球市场份额约为30%。 随着...