1. 程式人生 > 其它 >Maven專案程式碼生成器外掛(code-generator-maven-plugin)

Maven專案程式碼生成器外掛(code-generator-maven-plugin)

技術標籤:javajava設計模式

代理模式

代理模式旨在為服務類與客戶類之間插⼊其他功能,插⼊的功能對於調⽤者是透明的,起到偽裝控制的作⽤。

代理模式的兩個設計原則:代理類 與 委託類 具有相似的⾏為(共同);代理類增強委託類的⾏為

靜態代理

代理的三要素

共同的⾏為——介面目標類——實現行為;代理類——實現⾏為 增強⽬標物件⾏為

靜態代理的實現

定義共同的行為

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代理

代理模式實現分類以及對應區別

  1. 靜態代理:⼿動為⽬標物件製作代理物件,即在程式編譯階段完成代理物件的建立
  2. 動態代理:在程式運⾏期動態建立⽬標物件對應代理物件。
  3. jdk動態代理:被代理⽬標物件必須實現某⼀或某⼀組接⼝ 實現⽅式 通過回撥建立代理物件。
  4. cglib 動態代理:被代理⽬標物件可以不必實現接⼝,繼承的⽅式實現。
    動態代理相⽐較靜態代理,提⾼開發效率,可以批量化建立代理,提⾼程式碼復⽤率。