JAVA設計模式之代理模式

JAVA設計模式之代理模式

概念:

通過代理模式,控制對象訪問,可以詳細的控制某個類或對象的方法,在調用這個方法前做前處理,在調用這個方法後做後置處理(即AOP的微觀實現)

角色

  1. 抽象角色

    定義代理角色和真實角色的公共對外關係。

  2. 真實角色

    實現抽象角色,定義真實角色實現的具體業務邏輯,供代理類調用。關注真正的業務邏輯

  3. 代理角色

    實現抽象角色。是真實角色的代理,通過真實角色的業務邏輯來實現抽象方法,並可以附加自己的操作。將統一的流程控制放到代理角色中處理
    代理模式角色類圖

應用:

  1. 安全代理:屏蔽對真實角色的直接訪問;
  2. 遠程代理:通過代理類處理遠程方法的調用(RMI);
  3. 延遲加載:先加載輕量級的代理對象,真正需要時再加載真實對象。

分類

  1. 靜態代理(靜態定義代理類)
  2. 動態代理(動態生成代理類)

    -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();

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章