Java代理模式

         代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關係,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務。簡單的說就是,我們在訪問實際對象時,是通過代理對象來訪問的,代理模式就是在訪問實際對象時引入一定程度的間接性,因爲這種間接性,可以附加多種用途。

靜態代理

   由程序員創建或特定工具自動生成源代碼,也就是在編譯時就已經將接口,被代理類,代理類等確定下來。在程序運行之前,代理類的.class文件就已經生成。

public interface Marry {
    void prepare();//籌備婚禮
    void weeding();//婚禮
    void clear();//婚禮後收拾場地
}
public class Bridegroom implements Marry{

    @Override
    public void prepare() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void weeding() {
        System.out.println("新郎正在進行婚禮");
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub
        
    }

}
public class MarryProxy implements Marry{
    
    private Marry bridegroom;

    public MarryProxy(Marry bridegroom) {
        this.bridegroom = bridegroom;
    }
    @Override
    public void prepare() {
        System.out.println("婚前場地準備");
    }

    @Override
    public void weeding() {
        this.bridegroom.weeding();
    }

    @Override
    public void clear() {
        System.out.println("婚後收拾場地");
    }

}
public class Test {

    public static void main(String[] args) {
        Marry proxy = new MarryProxy(new Bridegroom());
        proxy.prepare();
        proxy.weeding();
        proxy.clear();
    }
}

結果:

婚前場地準備

新郎正在進行婚禮

婚後收拾場地

動態代理

 

代理類在程序運行時自動創建的代理方式被成爲動態代理。

javajava.lang.reflect包下提供了一個Proxy類和一個InvocationHandler接口,通過這個類和這個接口可以生成JDK動態代理類和動態代理對象。

 Proxy               動態生成代理類和對象

InvocationHandler   處理器接口,可以通過invoke方法實現對真實角色的代理訪問,每次通過Proxy生成代理類對象時都要指定對應的處理器對象。

public interface Marry {
    void prepare();//籌備婚禮
    void weeding();//婚禮
    void clear();//婚禮後收拾場地
}
public class Bridegroom implements Marry{

    @Override
    public void prepare() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void weeding() {
        System.out.println("新郎正在進行婚禮");
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub
        
    }

}
public class MarryHandler implements InvocationHandler{
    
    private Marry bridegroom;

    public MarryHandler(Marry bridegroom) {
        super();
        this.bridegroom = bridegroom;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(bridegroom, args);
        return null;
    }
}
public class Test {

    public static void main(String[] args) {
        Marry bridegroom = new Bridegroom();
        MarryHandler handler = new MarryHandler(bridegroom);

        Marry proxy = (Marry) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Marry.class },
                handler);
        proxy.weeding();
    }
}



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