Maven專案程式碼生成器外掛(code-generator-maven-plugin)
阿新 • • 發佈:2020-12-28
代理模式
代理模式旨在為服務類與客戶類之間插⼊其他功能,插⼊的功能對於調⽤者是透明的,起到偽裝控制的作⽤。
代理模式的兩個設計原則:代理類 與 委託類 具有相似的⾏為(共同);代理類增強委託類的⾏為
靜態代理
代理的三要素
有共同的⾏為——介面;目標類——實現行為;代理類——實現⾏為 增強⽬標物件⾏為
靜態代理的實現
定義共同的行為
public interface Marry {
public void toMarry();
}
目標類
/**
* 靜態代理 ——> ⽬標物件
*/
public class You implements Marry {
// 實現⾏為
@Override
public void toMarry() {
System.out.println("我要結婚了...");
}
}
代理類
/**
* 代理類
*/
public class MarryCompanyProxy implements Marry{
private Marry obj;
public MarryCompanyProxy(Marry obj){
this.obj = obj;
}
@Override
public void toMarry() {
System. out.println("訂酒店");
System.out.println("準備婚車");
System.out.println("佈置現場");
//目標類
obj.toMarry();
System.out.println("司儀開始宣告");
System.out.println("打掃清理現場");
}
}
測試
// ⽬標物件
You you = new You();
// 構造代理⻆⾊同時傳⼊真實⻆⾊
MarryCompanyProxy marryCompanyProxy = new MarryCompanyProxy(you);
// 通過代理物件調⽤⽬標物件中的⽅法
marryCompanyProxy.toMarry();
動態代理
JDK動態代理
介面
public interface RentCar {
public void toRentCar();
}
目標類
public class MrLi implements RentCar {
@Override
public void toRentCar() {
System.out.println("找到車輛,付押金");
}
}
代理類
public class JdkproxyFactory {
public Object getProxyBean(Object obj){
Class clazz =obj.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("篩選車型");
//目標類 OldMa的行為方法執行
Object ret = method.invoke(obj, args);
System.out.println("清理汽車");
System.out.println("保養車");
return ret;
}
});
}
}
CGLIB動態代理
目標類
public class OldLi {
public void toRentHouse() {
System.out.println("看房,籤合同");
}
}
代理類
public static Object getProxyBean(Object obj ){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("騎著小電驢帶顧客看房");
//呼叫目標類的方法
Object invoke = method.invoke(obj, objects);
System.out.println("打掃衛生,供網供電");
return invoke;
}
});
return enhancer.create();
}
}
測試
public class Starter {
public static void main(String[] args) {
//目標類
OldLi oldLi = new OldLi();
OldLi proxyBean = (OldLi) CglibProxyFactory.getProxyBean(oldLi);
proxyBean.toRentHouse();
}
}
JDK代理與CGLIB代理的區別
JDK動態代理實現接⼝,Cglib動態代理繼承思想
JDK動態代理(⽬標物件存在接⼝時)執⾏效率⾼於Ciglib
如果⽬標物件有接⼝實現,選擇JDK代理,如果沒有接⼝實現選擇Cglib代理
代理模式實現分類以及對應區別
- 靜態代理:⼿動為⽬標物件製作代理物件,即在程式編譯階段完成代理物件的建立
- 動態代理:在程式運⾏期動態建立⽬標物件對應代理物件。
- jdk動態代理:被代理⽬標物件必須實現某⼀或某⼀組接⼝ 實現⽅式 通過回撥建立代理物件。
- cglib 動態代理:被代理⽬標物件可以不必實現接⼝,繼承的⽅式實現。
動態代理相⽐較靜態代理,提⾼開發效率,可以批量化建立代理,提⾼程式碼復⽤率。