静态/动态代理模式

参考视频:【狂神说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();
    }
}
相关推荐
量化分析码农18 分钟前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
猫猫不是喵喵.28 分钟前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
熊猫钓鱼>_>38 分钟前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮39 分钟前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
曲径海盗1 小时前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
Cosolar2 小时前
极简智库:快速搭建你的开源项目教程阅读平台,让 docs/ 目录被更多人看见
java·架构·github
nice_lcj5202 小时前
【从零理解 Spring AI · 16】Agent 与工作流:什么该写死,什么该让模型决定
java·人工智能·后端·spring ai·ai应用开发
布莱克6052 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
北京云帆互联科技2 小时前
云帆培训考试系统更新说明:v9.3.0
java·学习
布莱克6053 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型