代理模式(委託模式)— 結構型

結構型簡介

結構型模式主要總結了一些類或對象組合在一起的經典結構,這些經典的結構可以解決特定應用場景的問題。結構型模式包括:代理模式、橋接模式、裝飾器模式、適配器模式、門面模式、組合模式、享元模式。

代理模式

代理模式又分爲:靜態代理和動態代理

律師這個職業大家應該都瞭解;就是代理打官司;下面以律師代理訴訟爲例介紹代理模式

靜態代理

靜態代理的特點就是代理和被代理都要實現或者繼承同一個接口或抽象類;

訴訟接口類

public interface ILawsuit {
    //提交申請
    void submit();

    //舉證
    void burden();
    
    //辯護
    void defend();
}

具體公訴人

public class ZhangSan implements ILawsuit {
    @Override
    public void submit() {
        System.out.println("老闆拖欠工資,特此仲裁");
    }

    @Override
    public void burden() {
        System.out.println("勞動合同和社保證明");
    }

    @Override
    public void defend() {
        System.out.println("事實證據清楚!");
    }
}

代理律師

public class Lawyer implements ILawsuit {
    private ZhangSan zhangSan;

    public Lawyer(ZhangSan zhangSan) {
        this.zhangSan = zhangSan;
    }

    @Override
    public void submit() {
        zhangSan.submit();
    }

    @Override
    public void burden() {
        System.out.println("指導公訴人蒐集證據");
        zhangSan.burden();
    }

    @Override
    public void defend() {
        System.out.println("當庭辯護等");
        zhangSan.defend();
    }
}

訴訟:

public class litigation {

    public static void main(String[] args) {
        ILawsuit zhangSan = new ZhangSan();

        ILawsuit lawyer = new Lawyer((ZhangSan) zhangSan);
        
        lawyer.submit();
        
        lawyer.burden();
        
        lawyer.defend();
        
    }
}

動態代理

Java給我提供了一個邊界的動態代理接口InvocationHandler,實現該接口重寫調用方法invoke。主要通過invoke方法來調用具體的被代理方法,也就是真實的方法。動態代理的實現是基於反射實現的;

實現InvocationHandler:動態代理類

public class DynamicProxy implements InvocationHandler {
    private Object obj; //被代理類的引用

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        //通過反射調用被代理類的對象的方法;    
        Object result = method.invoke(obj,args);
        return null;
    }
}

動態代理實現訴訟

public class Litigation {

    public static void main(String[] args) {
        ILawsuit zhangSan = new ZhangSan();
        //構造一個動態代理
        DynamicProxy proxy = new DynamicProxy(zhangSan);
        
        //獲取被代理類張三的ClassLoader
        ClassLoader loader = zhangSan.getClass().getClassLoader();
        
        //動態構造一個代理律師
        ILawsuit lawyer = (ILawsuit) Proxy.newProxyInstance(loader, new Class[]{ILawsuit.class}, proxy);
        
        lawyer.submit();

        lawyer.burden();

        lawyer.defend();

    }
}

總結:靜態和動態是從code方面來區分的代理模式的兩種方式;

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