JAVA設計模式之代理模式
概念:
通過代理模式,控制對象訪問,可以詳細的控制某個類或對象的方法,在調用這個方法前做前處理,在調用這個方法後做後置處理(即AOP的微觀實現)
角色
抽象角色
定義代理角色和真實角色的公共對外關係。
真實角色
實現抽象角色,定義真實角色實現的具體業務邏輯,供代理類調用。關注真正的業務邏輯
代理角色
實現抽象角色。是真實角色的代理,通過真實角色的業務邏輯來實現抽象方法,並可以附加自己的操作。將統一的流程控制放到代理角色中處理
應用:
- 安全代理:屏蔽對真實角色的直接訪問;
- 遠程代理:通過代理類處理遠程方法的調用(RMI);
- 延遲加載:先加載輕量級的代理對象,真正需要時再加載真實對象。
分類
- 靜態代理(靜態定義代理類)
動態代理(動態生成代理類)
-JDK自帶的動態代理
-javaassist字節碼操作庫實現
-CGLIB
-ASM(底層使用指令,可維護性差)
jdk自帶動態代理
java.lang.reflect.Proxy
-作用:動態生成代理類和對象
java.lang.reflect.InvocationHandler(處理器接口)
- 可以通過invoke方法實現對真實角色的代理訪問
- 每次通過Proxy生成代理類對象時,都指定對對應的處理器對象
代碼:
靜態代理:
public interface Star {
void sing();
}
public class RealStar implements Star {
@Override
public void sing() {
System.out.println("real sing");
}
}
public class ProxyStar implements Star {
private Star star;
public ProxyStar(Star star) {
this.star = star;
}
@Override
public void sing() {
System.out.println("proxy sing");
star.sing();
}
}
public class Main {
public static void main(String[] args) {
Star star = new RealStar();
ProxyStar proxyStar = new ProxyStar(star);
proxyStar.sing();
}
}
jdk自帶動態代理:
實現InvocationHandler
public class StarHandler implements InvocationHandler {
Star star;
public StarHandler(Star star) {
this.star = star;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = null;
System.out.println("####");
object = method.invoke(star, args);
return object;
}
}
public class Main {
public static void main(String[] args) {
Star star = new RealStar();
StarHandler starHandler = new StarHandler(star);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[] {Star.class}, starHandler);
proxy.sing();
}
}