动态代理
可以理解为一个代工厂
什么品牌都代工 有好多生产线 除了卖苹果手机之外还能卖别的品牌的手机
由于这个对象什么都能做 所以动态代理代理的就不是对象了 而是代理原来对象该做的事情(即方法)
Java已经给我们提供了 Proxy类 可以帮我们创建一个代理对象(这个对象就是动态代理的对象 什么都能做)
动态代理 代理方法(接口/功能)
商店接口:
public interface Store {
public iPhone selliPhone();
}
苹果商店:
public interface AppleStore extends Store{
//苹果的招牌留着 不做事了
public iPhone selliPhone();
}
iPhone手机:
public class iPhone{
private String name;
private String color;
public iPhone(){}
public iPhone(String name,String color){
this.name = name;
this.color = color;
}
public String getName() {
return name;
}
public String getColor() {
return color;
}
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
public void call() {
System.out.println("真的iPhone手机 打电话很流畅");
}
public void play() {
System.out.println("真的iPhone手机 玩游戏不卡顿");
}
public void photo() {
System.out.println("真的iPhone手机 拍照片很清晰");
}
}
代工厂:
public class ProxyFactory {
//代工厂
//有个方法 通过Proxy这个类获取一个代理对象(代工商店)
// 参数----> 代理谁
// 返回值---> 代理对象(因为不知道代理谁 所以用泛型来代替)
public static <T>T getStore(Class clazz){
//创建proxy代理对象前 需要三个参数
//0 类加载器---因为传递的是clazz这个类 所以需要把这个类加载进来
// 比如把代理的AppleStore这个类加载进来
ClassLoader loader = clazz.getClassLoader();
//1 代理谁(比如代理苹果店AppleStore 即传递进来的参数clazz)
Class[] classes = new Class[]{clazz};
//2 代理之后 具体该做什么事情(这里是卖手机)
InvocationHandler handler = new InvocationHandler() {
//这个invoke方法相当于是代理对象的真正执行方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//proxy就是代理对象
//method就是代理对象代替真实对象原来该做的方法
//args为代理对象接收到真实对象的参数 相当于执行方法所需参数
return null;
}
};
//1 通过Proxy类帮我们创建一个代理对象
T proxy = (T) Proxy.newProxyInstance(loader,classes,handler);
//2 将proxy代理对象返回
return proxy;
}
}
用户:
public static void main(String[] args){
//有一个代工厂 什么品牌都能卖
//比如这里代理苹果店
Store store = ProxyFactory.getStore(AppleStore.class);
iPhone p = store.selliPhone();
p.call();
p.play();
p.photo();
//有两个问题
//1 如果有一个代工厂做事情 那么真正的AppleStore还需要么?
// 可以不需要了 招牌留着 具体不做事
//2 如果苹果店不做事 那么是不是应该代工店做事情?
}