代理模式
分类
- 静态代理
- 动态代理
静态代理
静态定义代理类
类图:
- 抽象角色
定义代理角色和真实角色的公共对外方法 - 真实角色
实现抽象角色,实现真正的核心逻辑 - 代理角色
实现抽象角色,通过真实角色的业务逻辑方法来实现抽象方法,可以添加自己的功能
代码
/**
*
* @author Nicholas 其中,sing()是核心逻辑 bookTicket() 是非核心方法
*/
public interface Star {
/**
* 唱歌
*/
void sing();
/**
* 订票
*/
void bookTicket();
}
public class RealStar implements Star {
@Override
public void sing() {
System.out.println(" real sing");
}
@Override
public void bookTicket() {
System.out.println("real book ticket");
}
}
/**
* 代理对象
*
* @author Nicholas
*
*/
public class ProxyStar implements Star {
/**
* 代理对象不能唱歌,但是可以定票
*
*/
/**
* 要代理的对象
*/
private Star realStar;
public ProxyStar(Star star) {
this.realStar = star;
}
@Override
public void sing() {
realStar.sing();
}
@Override
public void bookTicket() {
}
}
package com.weixuan.pattern.proxy;
/**
* Created by Nicholas on 2015/9/20.
*/
public class Client {
public static void main(String[] args){
RealStar realStar = new RealStar();
Star proxyStar = new ProxyStar(realStar);
proxyStar.sing();
proxyStar.bookTicket();
}
}
动态代理
动态生成代理类,不需要自己定义代理类
常见的工具
1. JDK自带的动态代理
2. javaassist字节码操作库的实现
3. CGLIB
4. asm底层使用指令
JDK自带的动态代理
核心的两个类
java.lang.reflect.Proxy
:动态生成代理类和对象
java.lang.reflect.InvocationHandler
:这个是处理器接口,可以使用invoke方法访问真实角色
代码
package com.weixuan.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyProxy implements InvocationHandler {
//要代理的对象
private Star reaStar;
public MyProxy(Star star) {
this.reaStar = star;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
method.invoke(reaStar, args);
return null;
}
}
package com.weixuan.proxy;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
Star realStar = new RealStar();
MyProxy myProxy = new MyProxy(realStar);
Star proxyStar = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
new Class[] { Star.class }, myProxy);
proxyStar.bookTicket();
}
}