Java JDK动态代理


一、代理是什么?

  1. 代理是一种设计模式,被代理对象(真实对象)实现具体的服务方法,委托给代理来进行处理。
  2. 代理类可以在被代理对象的方法上附加更多的处理。
  3. 一般有静态代理和动态代理,区别在于,静态代理一个代理类对应一个真实对象,动态代理可以对应不同的真实对象。

二、示例

本例实现一个外卖的代理类,它可以接收不同商家的外卖服务,并在invoke的时候附加处理逻辑(本例为增加打印)。

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

//外卖接口
interface TakeoutService {
    //点餐
    void Order(String phone, String food, String address);
}
//阿婆牛肉面外卖
class ApoNoodleTakeoutService implements TakeoutService {
    @Override
    public void Order(String phone, String food, String address) {
        System.out.printf("M团点餐. 电话: %s, 餐品: %s, 地址:%s", phone, food, address);
    }
}

//外卖代理平台
class TakeoutProxy implements InvocationHandler {
    private TakeoutService restaurant; //被代理对象,餐饮店

    public TakeoutProxy(TakeoutService restaurant) {
        this.restaurant = restaurant;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(method.getName().equals("Order")){
            System.out.println("外卖点餐开始处理啦");
            method.invoke(restaurant,args);
            System.out.println("外卖点餐完成处理啦");
        }
        return null;
    }

    public Object getNewInstance(){
        return Proxy.newProxyInstance(restaurant.getClass().getClassLoader(), new Class[]{ApoNoodleTakeoutService.class},this);
    }
}

public class Me {
    public static void main(String[] args) {
        //阿婆牛肉面外卖
        ApoNoodleTakeoutService apoNoodle = new ApoNoodleTakeoutService();
        //代理平台
        TakeoutService platform = (TakeoutService) new TakeoutProxy(apoNoodle).getNewInstance();
        //点餐
        platform.Order("13800138000", "阿婆牛肉面", "杭州路10号100室");
    }
}

三、总结

Java的名词晦涩,代理模式是一个继承+封装的模式,而动态代理实际是接口调用实现类的反射操作,关键在于词汇的理解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值