設計模式之—代理模式


1.代理模式定義

Provide a surrogate or placeholder for another object to control access to it. 對其他對象提供一種代理,以控制對這個對象的訪問

2.代理模式通用類圖

代理模式的通用類圖如下:

其中Subject為抽象主題角色:

Subject為普通業務接口

RealSubject為具體主題角色:

此類為具體被代理的對象

Proxy為代理類:

此類負責執行被代理的功能,並且在處理前后做預處理和善后操作

3.通用模式的代碼實現:

Subject類:

public interface Subject {

    /**
     * 發送request請求
     */
    void request();
}

RealSubject類:

public class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("Send request:" + "....");
    }
}

Proxy代理類,在代理類中可以通過構造函數或setter方法傳入。

public class Proxy implements Subject {

    private Subject subject;

    public Proxy(Subject subject){
        this.subject = subject;
    }

    @Override
    public void request() {
        subject.request();
    }

    private void before(){
        // do before
    }

    private void after(){
        //do after
    }
}

4.動態代理

動態代理:是在實現階段不用關心代理誰,而在運行階段才指定代理哪一個對象。

其中Spring的AOP是典型的動態代理模式
下面我們以網絡連接中的代理為例說明動態代理,類圖如下:

首先定義一個網絡連接器:Connector,此方法中只定義了一個connect方法,用於創建網絡連接,代碼如下:

public interface Connector {

    /**
     * 建立網絡連接
     */
    void connect();
}

然后定義Connector接口的實現類如下:

public class NetworkConnector implements Connector {

    @Override
    public void connect() {
        System.out.println("Connect to network.");
    }
}

此類為被代理的對象。
最后定義動態代理類,JDK中定義了用於動態代理的接口

InvocationHandler,實現動態代理的類必須實現此接口。

代碼如下:

public class NetworkConnectorDP implements InvocationHandler {

    private Object realObject;

    public NetworkConnectorDP(Object realObject){
        this.realObject = realObject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
        return method.invoke(this.realObject, args);
    }
}

最后定義Client帶使用動態代理功能,代碼如下:

public class Client {

    public static void main(String[] args) throws Exception {
        Connector connector = new NetworkConnector();

        InvocationHandler handler = new NetworkConnectorDP(connector);
        ClassLoader classLoader = connector.getClass().getClassLoader();

        Connector proxy = (Connector) Proxy.newProxyInstance(classLoader, new Class[]{Connector.class}, handler);
        System.out.println("Start connect to network.");
        proxy.connect();
        System.out.println("Connect to network finished.");

    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM