代理模式(Proxy Pattern)

代理模式

一、什麼是代理模式

  代理模式(Proxy Pattern),指調用者通過調用代理對象來訪問真實對象,在真實對象訪問之前或者之後加入對應的邏輯,或者根據其他規則控制是否使用真實對象。代理對象需要和真實對象建立代理關係。

二、代理模式的步驟

  1. 代理對象和真實對象建立代理關係
  2. 實現代理對象的代理邏輯方法

三、代理模式的優缺點

1、優點

  1. 職責清晰。
  2. 高擴展性。
  3. 智能化。

2、缺點

  1. 由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。
  2. 實現代理模式需要額外的工作,有些代理模式的實現非常複雜。

四、代碼實現

1、代理模式中的角色

  1. 抽象對象角色:聲明瞭目標類及代理類對象的共同接口,這樣在任何可以使用目標對象的地方都可以使用代理對象。
  2. 目標對象角色:定義了代理對象所代表的目標對象。
  3. 代理對象角色:代理對象內部含有目標對象的引用,從而可以在任何時候操作目標對象;代理對象和目標對象具有統一的接口,以便可以再任何時候替代目標對象。代理對象通常在客戶端調用傳遞給目標對象之前或者之後,執行某些操作,而非單純的將調用傳遞給目標對象。

2、具體代碼實現

/**
 * 抽象對象
 *
 * @author zt1994 2019/3/2 16:25
 */
public interface SayHello {

    void sayHelloWorld();
}
/**
 * 真實對象
 *
 * @author zt1994 2019/3/2 16:27
 */
public class SayHelloImpl implements SayHello {

    @Override
    public void sayHelloWorld() {
        System.out.println("Hello World!");
    }
}
/**
 * 代理對象
 *
 * @author zt1994 2019/3/2 16:28
 */
public class SayHelloProxy implements SayHello {

    private SayHello sayHello;

    public SayHelloProxy(SayHello sayHello) {
        this.sayHello = sayHello;
    }

    @Override
    public void sayHelloWorld() {
        System.out.println("調用sayHello之前的處理");
        sayHello.sayHelloWorld();
        System.out.println("調用sayHello之後的處理");
    }
}
/**
 * 測試靜態代理
 *
 * @author zt1994 2019/3/2 16:30
 */
public class staticProxyTest {

    /**
     * 測試靜態代理
     */
    @Test
    public void testStaticProxy() {
        SayHelloImpl sayHello = new SayHelloImpl();
        sayHello.sayHelloWorld();

        SayHelloProxy sayHelloProxy = new SayHelloProxy(sayHello);
        sayHelloProxy.sayHelloWorld();
    }
}

測試結果:
Hello World!
調用sayHello之前的處理
Hello World!
調用sayHello之後的處理

源碼地址:https://github.com/zt19994/designPattern

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