代理模式
核心作用:通过代理控制对对象的访问。详细控制某个对象的方法。
是面向切面编程核心实现机制(AOP)
核心角色:
1、抽象角色:定义代理和真实角色公共的对外方法
2、代理角色:实现抽象角色,是真实角色的代理,通过调用真实角色的方法实现抽象方法,并符加自己的操作。
3、真实角色:实现抽象角色,定义自己所要实现的操作方法,供代理调用。
静态代理
抽象角色
public interface MakkaPakka {
void sing();
void dance();
}
真实角色
public class RealMakka implements MakkaPakka {
@Override
public void sing() {
System.out.println("Makka Pakka Wakka……");
}
@Override
public void dance() {
System.out.println("jump jump jump!");
}
}
代理角色
public class ProxyMakka implements MakkaPakka{
private MakkaPakka m;
public ProxyMakka(MakkaPakka m) {
this.m = m;
}
@Override
public void sing() {
m.sing();
}
@Override
public void dance() {
m.dance();
}
}
动态代理
使用JDK自带的动态代理
//InvocationHandler接口
public class MakkaHandler implements InvocationHandler {
private MakkaPakka m;
public MakkaHandler(MakkaPakka m) {
this.m = m;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
System.out.println("唱歌前");
if (method.getName().equals("sing")) {
obj = method.invoke(m,args);
}
System.out.println("唱歌后");
return obj;
}
}
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
MakkaPakka m = new RealMakka();
MakkaHandler handler = new MakkaHandler(m);
MakkaPakka proxy = (MakkaPakka) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[] {MakkaPakka.class},handler);
proxy.sing();
}
}