代理模式——动态代理(结构型)

JDK 自带的动态代理

  •  java.lang.reflect.Proxy:生成动态代理类和对象;
  •  java.lang.reflect.InvocationHandler(处理器接口):可以通过invoke方法实现

RealSubject真实对象,将它注册到处理器,然后创建一个代理类,传入处理器和真实类实现的接口,最后就可以代理真实对象了

每次通过 Proxy 生成的代理类对象都要指定对应的处理器对象。然后代理类调用方法时,自动调用处理器的invoke方法

代码:

a) 接口:Subject.java

package proxy.dynamic;

public interface Subject
{
    public int sellBooks();
 
    public String speak();
}

b)真实对象:RealSubject.java 

package proxy.dynamic;

public class RealSubject implements Subject{
    @Override
    public int sellBooks() {
        System.out.println("卖书");
        return 1 ;
    }
 
    @Override
    public String speak() {
        System.out.println("说话");
        return "张三";
    }
}

c)处理器对象:MyInvocationHandler.java 

package proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
 
/**
 * 定义一个处理器,里面包含了真实对象
 * @author gnehcgnaw
 * @date 2018/11/5 19:26
 */
public class MyInvocationHandler implements InvocationHandler {
    /**
     * 因为需要处理真实角色,所以要把真实角色传进来
     */
    Subject realSubject ;
 
    public MyInvocationHandler(Subject realSubject) {
        this.realSubject = realSubject;
    }
 
    /**
     *
     * @param proxy    代理类
     * @param method    正在调用的方法
     * @param args      方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("调用代理类");
        if(method.getName().equals("sellBooks")){
            int invoke = (int)method.invoke(realSubject, args);
            System.out.println("调用的是卖书的方法");
            return invoke ;
        }else {
            String string = (String) method.invoke(realSubject,args) ;
            System.out.println("调用的是说话的方法");
            return  string ;
        }
    }
}

 d)调用端:Client.java

package proxy.dynamic;

import java.lang.reflect.Proxy;
 
/**
 * 调用类
 * @author gnehcgnaw
 * @date 2018/11/7 20:26
 */
public class Client {
    public static void main(String[] args) {
        //真实对象
        Subject realSubject =  new RealSubject();
        //创建处理器,传入真实对象
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(realSubject);
        /**
         * 利用Proxy类的静态方法newProxyInstance()创建代理对象,传入类加载器,真实类的接口,处理器
         */
        Subject proxyClass = (Subject) Proxy.newProxyInstance(
                ClassLoader.getSystemClassLoader(), 
                new Class[]{Subject.class}, 
                myInvocationHandler
        );
 
        //代理类代替真实类进行操作
        proxyClass.sellBooks();
        proxyClass.speak();
    }
}
调用代理类
卖书
调用的是卖书的方法
调用代理类
说话
调用的是说话的方法

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值