代理模式
核心作用:通过代理,控制对象的访问(相当于生活中的中介)
核心角色
- 抽象角色:定义代理角色和真实角色的公共对外方法。
- 真实角色:定义真实角色所要实现的业务逻辑,供代理角色使用。
- 代理角色:真实角色的代理,实现统一的流程控制。
应用场景
- 安全代理:屏蔽对真实角色的访问
- 远程代理:通过代理类处理远程方法待用
- 延迟加载:真实角色的加载需要很多的资源,先加载轻量级的代理对象,真正需要再加载真实对象
动态代理模式
定义: 动态生成代理类
- JDK自带的代理类
- 字节码操作库实现
- CGLIB
- ASM(底层使用指令,可维护性较差)
优点: 抽象角色中的所有方法都被转移到一个统一的调用处理器一个集中的方法中去处理,更加灵活和统一的处理众多的方法
java.lang.reflect.Proxy//动态生成代理类和对象
java.lang.reflect.InvocationHandler//处理器接口
/*
*可以通过invoke()方法实现对真实角色的代理访问
*每次通过Proxy生成代理类对象时都要指定对应的处理器对象
*/
package dynamicProxy;
import java.lang.reflect.Proxy;
/**
* @Description:客户
* @version 1.0
* @since JDK1.8
* @author Li-Ying
* @date 2020年4月19日 上午9:41:42
*/
public class Client {
public static void main(String [] args)
{
Star realStar=new RealStar();
staticHandler handler=new staticHandler(realStar);
Star proxy = (Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.confer();
proxy.sing();
}
}
package dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @Description:TODO
* @version 1.0
* @since JDK1.8
* @author Li-Ying
* @date 2020年4月19日 下午4:42:42
*/
public class staticHandler implements InvocationHandler{
Star realstar;
public staticHandler(Star realstar) {
// TODO Auto-generated constructor stub
super();
this.realstar=realstar;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("=======");
if(method.getName().equals("sing"))//需要使用真实对象的时候进行动态激活调用的方法
method.invoke(realstar, args);
return null;
}
}
静态代理模式
定义: 静态生成代理类
/**
* @Description:静态代理-真实对象
* @version 1.0
* @since JDK1.8
* @author Li-Ying
* @date 2020年4月19日 上午9:30:59
*/
public class RealStar implements Proxy_star{
@Override
public void confer() {
// TODO Auto-generated method stub
System.out.println("RealStar.confer");
}
@Override
public void sing() {
// TODO Auto-generated method stub
System.out.println("RealStar.sing");
}
@Override
public void bookTicket() {
// TODO Auto-generated method stub
System.out.println("RealStar.bookticket");
}
}
/**
* @Description:静态代理-真实角色
* @version 1.0
* @since JDK1.8
* @author Li-Ying
* @date 2020年4月19日 上午9:23:43
*/
public class StaticProxy implements Proxy_star{
private Proxy_star star;
public StaticProxy (Proxy_star star) {
super();
this.star=star;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
@Override
public void confer() {
// TODO Auto-generated method stub
System.out.println("confer");
}
@Override
public void sing() {
// TODO Auto-generated method stub
star.sing();
}
@Override
public void bookTicket() {
// TODO Auto-generated method stub
System.out.println("bookTicket");
}
}
/**
* @Description:静态代理-抽象接口
* @version 1.0
* @since JDK1.8
* @author Li-Ying
* @date 2020年4月19日 上午9:26:03
*/
public interface Proxy_star {
void confer();
void sing();
void bookTicket();
}
代理对象在处理不能处理的逻辑时候,会调用真实对象进行处理,但是客户在进行调用的只有代理对象。