代理模式
一、什麼是代理模式
代理模式(Proxy Pattern),指調用者通過調用代理對象來訪問真實對象,在真實對象訪問之前或者之後加入對應的邏輯,或者根據其他規則控制是否使用真實對象。代理對象需要和真實對象建立代理關係。
二、代理模式的步驟
- 代理對象和真實對象建立代理關係
- 實現代理對象的代理邏輯方法
三、代理模式的優缺點
1、優點
- 職責清晰。
- 高擴展性。
- 智能化。
2、缺點
- 由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。
- 實現代理模式需要額外的工作,有些代理模式的實現非常複雜。
四、代碼實現
1、代理模式中的角色
- 抽象對象角色:聲明瞭目標類及代理類對象的共同接口,這樣在任何可以使用目標對象的地方都可以使用代理對象。
- 目標對象角色:定義了代理對象所代表的目標對象。
- 代理對象角色:代理對象內部含有目標對象的引用,從而可以在任何時候操作目標對象;代理對象和目標對象具有統一的接口,以便可以再任何時候替代目標對象。代理對象通常在客戶端調用傳遞給目標對象之前或者之後,執行某些操作,而非單純的將調用傳遞給目標對象。
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之後的處理