一、代理是什么?
- 代理是一种设计模式,被代理对象(真实对象)实现具体的服务方法,委托给代理来进行处理。
- 代理类可以在被代理对象的方法上附加更多的处理。
- 一般有静态代理和动态代理,区别在于,静态代理一个代理类对应一个真实对象,动态代理可以对应不同的真实对象。
二、示例
本例实现一个外卖的代理类,它可以接收不同商家的外卖服务,并在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的名词晦涩,代理模式是一个继承+封装的模式,而动态代理实际是接口调用实现类的反射操作,关键在于词汇的理解。