静态/动态代理模式

参考视频:【狂神说Java】Spring5最新完整教程IDEA版通俗易懂 点击观看

文章目录


静态代理模式

1、接口

java 复制代码
package com.findx.demo01;
//租房
public interface Rent {
    public void rent();
}

2、真实角色

java 复制代码
package com.findx.demo01;
//房东
public class Host implements  Rent{
    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}

3、代理角色

java 复制代码
package com.findx.demo01;
//代理
public class Proxy implements  Rent{
    private Host host;
    public Proxy() {
    }
    public Proxy(Host host) {
        this.host = host;
    }
    @Override
    public void rent() {
        seeHouse();
        host.rent();
        contract();
        fare();
    }
    //看房
    public void seeHouse() {
        System.out.println("中介带你看房");
    }
    //收中介费
    public void fare() {
        System.out.println("收中介费");
    }
    //签合同
    public void contract() {
        System.out.println("签租赁合同");
    }
}

4、客户端访问代理角色

java 复制代码
package com.findx.demo01;

public class Client {
    public static void main(String[] args) {
        //房东要出租房子
        Host host = new Host();
        //代理
        Proxy proxy = new Proxy(host);
        //不用面对房东直接找中介租房
        proxy.rent();
    }
}

动态代理模式

java 复制代码
package com.findx.demo01;
//房东
public class Host implements  Rent{
    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}
java 复制代码
package com.findx.demo01;
//租房
public interface Rent {
    public void rent();
}
java 复制代码
package com.findx.demo01;

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

//自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private Rent rent;
    public void setRent(Rent rent) {
        this.rent = rent;
    }
    //生成得到代理类
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
    }
    //处理代理实例并且返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质就是使用反射机制实现
        seeHouse();
        Object result = method.invoke(rent, args);
        fare();
        return result;
    }
    //seeHouse中介带你看房
    public void seeHouse() {
        System.out.println("中介带你看房");
    }
    //fare收中介费
    public void fare() {
        System.out.println("收中介费");
    }
}
java 复制代码
package com.findx.demo01;
public class Client {
    public static void main(String[] args) {
        //真实角色
        Host host = new Host();
        //代理角色,现在没有
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setRent(host);
        Rent proxy = (Rent) pih.getProxy();//动态生成代理类
        proxy.rent();
    }
}
相关推荐
彧azz8 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
IT_Octopus8 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
嵌入式学习菌8 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
长征coder8 小时前
【无标题】
java·性能优化
matlab代码9 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
新时代牛马9 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet9 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
matlab代码9 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk55510 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin1997010801610 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas