JAVA设计模式之代理模式动态代理

1. 什么是动态代理?

动态代理在实现阶段不用关心代理谁,而是在运行阶段才指定代理哪一个对象。常见的有Spring中的AOP就用到了动态代理。而动态代理有两部分,JDK动态代理和CGlib动态代理。本次对jdk动态代理进行整理

2. 动态代理

2.1 代理举例

还是曾经的例子,我们个人打游戏太累,找个代练给我们上分,这就是代理。
结构如图:
在这里插入图片描述

2.2 创建接口IGamePlayer

public interface IGamePlayer {
    // 登录游戏
    void login(String user, String password);
    // 打怪
    void killBoss();
}

2.3 创建游戏玩家GamePlayer

public class GamePlayer implements IGamePlayer {
    private String name = "";
    private IGamePlayer proxy = null;

    public GamePlayer(String _name) {
        this.name = _name;
    }

    @Override
    public void login(String user, String password) {
        System.out.println("登录名为" + user + "的用户" + this.name + "登录成功");
    }

    @Override
    public void killBoss() {
        System.out.println(this.name + "打boss");
    }
}

2.4 创建动态代理类GamePlayIH

public class GamePlayIH implements InvocationHandler {
    // 被代理者
    Class cls = null;
    // 被代理实例
    Object obj = null;

    public GamePlayIH(Object _obj) {
        this.obj = _obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object reuslt = method.invoke(this.obj, args);
        return reuslt;
    }
}

2.5 创建测试场景类Client

public class Client {
    public static void main(String[] args) {
        // 1直接访问真实角色
        IGamePlayer player = new GamePlayer("张三");
        InvocationHandler handler = new GamePlayIH(player);
        ClassLoader cl = player.getClass().getClassLoader();
        IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(cl, player.getClass().getInterfaces(), handler);
        proxy.login("zhangsan", "123");
        proxy.killBoss();
    }
}

2.6输出:

在这里插入图片描述

3. 代理可以对方法进行增强

当我们账户被代理登录后代练,我们应该收到登录信息,于是我们修改代理类

public class GamePlayIH implements InvocationHandler {
    // 被代理者
    Class cls = null;
    // 被代理实例
    Object obj = null;

    public GamePlayIH(Object _obj) {
        this.obj = _obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object reuslt = method.invoke(this.obj, args);
        // 增强点
        if (method.getName().equals("login")) {
            System.out.println("有人在用我账号");
        }
        return reuslt;
    }
}

输出
在这里插入图片描述
4. 暂时先做到这里,继续学习深入再整理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l8947943

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值