前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-代理模式

设计模式-代理模式

作者头像
武培轩
发布2019-08-31 20:04:59
2990
发布2019-08-31 20:04:59
举报
文章被收录于专栏:武培轩的专栏

模式定义

给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用

为什么使用代理

在不改变目标对象方法的情况下对方法进行增强

代理模式实例

静态代理

先创建一个用户接口(UserInterface),声明一个方法

代码语言:javascript
复制
public interface UserInterface {

    void service(String s);
}

创建实现类(UserImpl)

代码语言:javascript
复制
public class UserImpl implements UserInterface {

    @Override
    public void service(String s) {
        System.out.println("我是" + s);
    }
}

创建代理对象类(UserProxy),通过代理类创建实现类实例并访问其方法

代码语言:javascript
复制
public class UserProxy implements UserInterface {

    private UserInterface user;

    public UserProxy(UserImpl user) {
        this.user = user;
    }

    @Override
    public void service(String s) {
        System.out.println("检查身份");
        user.service(s);
        System.out.println("请进门");
    }
}

客户端调用

代码语言:javascript
复制
public class ProxyTest {
    public static void main(String[] args) {
        UserImpl user = new UserImpl();
        UserProxy proxy = new UserProxy(user);
        proxy.service("wupx");
    }
}

输出结果

代码语言:javascript
复制
检查身份
我是wupx
请进门

动态代理

先创建一个User接口

代码语言:javascript
复制
public interface User {

    void code();

    void sleep();
}

创建User的实现类(UserImpl)

代码语言:javascript
复制
public class UserImpl implements User {
    @Override
    public void code() {
        System.out.println("开始敲代码");
    }

    @Override
    public void sleep() {
        System.out.println("开始睡觉");
    }
}

再创建一个代理类(UserImpProxy)

代码语言:javascript
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class UserImpProxy implements InvocationHandler {

    private User user;

    public UserImpProxy(User user) {
        this.user = user;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String methodName = method.getName();
        Object result;
        if ("code".equals(methodName)) {
            System.out.println("讨论需求");
            result = method.invoke(user, args);
            System.out.println("提测");
        } else if ("sleep".equals(methodName)) {
            System.out.println("洗澡");
            result = method.invoke(user, args);
        } else {
            result = method.invoke(user, args);
        }
        return result;
    }
}

去测试动态代理

代码语言:javascript
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class TestProxy {
    public static void main(String[] args) {
        UserImpl user = new UserImpl();
        InvocationHandler userProxyHandler = new UserImpProxy(user);
        User userProxy = (User) Proxy.newProxyInstance(user.getClass().getClassLoader(),
                user.getClass().getInterfaces(), userProxyHandler);
        userProxy.code();
        userProxy.sleep();
    }
}

运行结果

代码语言:javascript
复制
讨论需求
开始敲代码
提测
洗澡
开始睡觉

总结

使用Java动态代理的两个重要步骤

  1. 通过实现 InvocationHandler 接口创建自己的调用处理器;
  2. 通过为Proxy类的newProxyInstance方法指定代理类的ClassLoader 对象和代理要实现的interface以及调用处理器InvocationHandler对象来创建动态代理类的对象;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模式定义
  • 为什么使用代理
  • 代理模式实例
    • 静态代理
      • 动态代理
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档