代理设计模式

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

基础代理实现模型

以下是实现一个用户上网的代理实现:

//定义Network接口
interface Network{
    //定义浏览的抽象方法
    public void browse();
}
//真实上网操作
class RealCustomer implements Network{
    @Override
    public void browse() {//覆写抽象方法
        System.out.println("上网浏览信息");
    }    
}
//代理上网
class Proxy implements Network{
    private Network network;
    //设置代理的真实操作
    public Proxy(Network network) {
        //设置代理的子类
        this.network = network;
    }
    //与具体上网相关的操作
    public void check(){
        System.out.println("用户是否合法");
    }
    @Override
    public void browse() {
        this.check();//可以调用多个与具体业务相关的操作
        this.network.browse();//调用真实上网操作
    }

}
public class ProxyGOF {
    public static void main(String[] args) {
        //定义接口对象
        Network network = null;
        //实例化代理,同时传入代理的真实操作
        network = new Proxy(new RealCustomer());
        network.browse();//客户实现上网功能,不关心代理是如何实现的
    }
}

这种代理只能实现一个接口的子类对象,无法实现多接口的子类对象。需要使用动态代理来解决这种问题。

动态代理设计模型
想要实现动态代理设计的实现,代理类不再局限于具体实现某一个具体的类。
在Java核心API中提供了一个java.lang.reflect.InvocationHandler接口。

public interface InvocationHandler {

    /**
     *处理代理实例上的方法调用并返回结果。 当在与之关联的代理实例上调用方法时,将在调用处理程序中调用此方法。
     * @param   proxy 调用该方法的实例
     * @param   method 返回的是被调用的方法对象,取得了Method对象意味着可以使用invoke()反射调用方法
     * @param   args 表示方法中接收到的参数
     * @return  方法的返回值
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

如果要想进行对象的绑定,那么就需要使用到一个Proxy的程序类,这个程序类的主要功能是可以绑定所有的你需要绑定的接口子类的对象,而且这些对象都是根据接口自动创建的,该类中有一个动态创建绑定对象的方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) IllegalArgumentException
动态代理的实现实例:

package com.czl.gof;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface ISubject{//代理设计的核心在于有一个核心接口操作
    public void browse(String user,String pass);//用户上网是核心业务
}
class RealSubject implements ISubject{//真实用户实现上网功能
    @Override
    public void browse(String user, String pass) {
        System.out.println("[userName] : " + user + ", [password] :" + pass);
    }   
}
class DynamicProxy implements InvocationHandler{
    private Object target;//绑定任意的接口对象,使用Object类型
    /**
     * 实现真实对象的绑定处理,同时返回代理对象
     * @param target
     * @return 返回一个代理对象(这个对象是根据接口定义动态创建形成的代理对象)
     */
    public Object bind(Object target) {
        this.target = target;
        //返回一个代理对象。
        //target.getClass().getClassLoader()表示接口对象的类加载路径;
        //target.getClass().getInterfaces()表示接口对象数,是一个数组对象;
        //this表示当前对象,在次类中指的是DynamicProxy类对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
    //定义代理实现的方法
    public void register(){
        System.out.println("register");
    }
    public void logout(){
        System.out.println("log out");
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.register();//调用登记方法
        //反射调用实现真实主题的方法
        Object ret = method.invoke(this.target, args);
        this.logout();//调用登出方法
        return ret;
    }

}
public class ProxyGOF {
  public static void main(String[] args) {
      ISubject subject = (ISubject) new DynamicProxy().bind(new RealSubject());
      subject.browse("tom", "123");
  }
}
SpringBoot Actuator未授权访问漏洞实战:从发现到利用 本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。 阅读详情

相关推荐

linux虚拟机和电脑ping通(可上网)

linux虚拟机(Ubuntu)和电脑ping通。

观则明的博客 4090

设计模式第4讲——代理模式(Proxy)

代理模式属于结构型设计模式。一、什么是代理模式二、分类 三、特点 四、应用场景4.1 生活场景4.2 Java场景 五、代码实现5.0 代码结构5.1 静态代理5.2 JDK动态代理5.3 Cglib代理 六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 8963

三角洲行动交易行自动化脚本

DFMarketBot - 三角洲行动自动交易助手 DFMarketBot是一款专为三角洲行动游戏设计的交易行自动化工具,通过OCR识别和鼠标模拟实现自动补卡、补子弹功能。项目采用Python开发,支持Windows平台,主要功能包括: 自动检测并购买指定物品(房卡/子弹) 价格监控与智能购买(低于设定价格自动下单) 自定义购买数量与次数限制 支持窗口/无窗口两种游戏模式 使用前需安装Tesseract OCR引擎并配置游戏为1920*1080分辨率。通过JSON文件可灵活配置监控物品清单、理想价格和购买策

愤怒的阿木木的博客 3万+

设计模式——代理模式

静态代理、JDK动态代理、Cglib 代理

种一棵树最好的时间是十年前,其次是现在 2597

23种设计模式代理模式

代理模式属于结构型设计模式,其核心思想是为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,并可以在不改变客户端代码的情况下增强或控制对象的访问。

JAVA开发区的博客 3749

08【代理设计模式】_代理设计模式类图

结构型模式(Structural Pattern)关注类和对象的组合。其描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。1)类结构型模式:类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承和实现关系。2)对象结构型模式:对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。

2401_89191522的博客 1066

设计模式代理设计模式

JDK动态代理

m0_64681527的博客 1699

Proxy Design Pattern 代理设计模式

代理设计模式,这个模式很多用于服务器客户端之类的,上网也经常使用代理之类的,想起来感觉是很复杂的,不过这个设置模式本身是很简单的。 就是一个类调用另外一个类的函数,客户调用的是一个类,而实际的工作是由另外一个类做的。 体现这个设计模式的代码: #include class RealObj { public: virtual void handleReq() = 0; };

靖空间 1480

设计模式代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,旨在为其他对象提供一种代理以控制对该对象的访问。它通过引入代理类来控制对目标对象的访问,代理对象与客户端进行交互,并根据具体需求对目标对象进行额外的功能扩展、权限控制、懒加载等。代理模式的核心思想是通过一个中介对象(代理对象)来替代直接访问目标对象,从而增强或改变目标对象的行为。@Override。

道可道非常道 1802

设计模式---代理模式(DesignPattern_Proxy)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 134

设计模式代理模式

定义代理模式就是为被访问的目标对象提供一个代理,此时代理对象充当访问对象和目标对象之间的媒介,通过代理对象实现对目标对象的访问。被代理的对象可以是远程对象、创建开销大的对象以及需要安全控制的对象,Java 中的代理按照代理的生成时机不同分为静态代理和动态代理,静态代理就是在编译期就生成代理对象,而动态代理是在 Java 运行时动态生成,而动态代理又分为 JDK 动态代理和 Cglib 动态代理两种。代理模式的角色组成抽象主题类(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法。

华仔仔的博客 3987

十七、代理设计模式

1. 代理设计模式介绍代理设计模式,从名字中我们就能知道其大致意思。我们生活中有很多“代理”,比如,租房中介,海外代购等。就是一种本来需要A做的事,让B去代做。 定义:为其他对象提供一种代理以控制对这个对象的访问。2. 代理设计模式使用场景 当我们无法直接访问某一个对象时,可以通过一个代理对象间接访问。通常委托对象和代理对象有着相同的接口。 (1)、远程代理,为一个对象在不同的地址空间提供局部代表

sp不会玩ps 1487

设计模式(DesignPattern)之代理模式(Proxy)

1、定义         代理模式也称为委托模式,为一个对象提供一个代理对象,以此来控制被代理对象的访问,简单来说就是代理对象代替被代理对象来完成一些事情。         代理模式一般分为静态代理和动态代理:         静态代理代理类在代码编译以前就已经存在。         动态代理:运行时动态的创建代理对象,可以很灵活的代理自己想要代理的对象,通过反射机制来实现。 2、使用...

inventor1024的博客 528
上一篇: 工厂设计模式
下一篇: ThreadLocal详解
shmilychan
博客等级 码龄10年 71粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值