設計模式的學習與使用在JAVA編寫的程序中佔有舉足輕重的地位,因此筆者今天就簡單的說一下設計模式中的代理模式
1.什麼是代理模式?(取自《深入淺出設計模式》)
代理模式的定義爲:爲其他對象提供一種代理以控制對這個對象的訪問。說白了就是,在一些情況下客戶不想或者不能直接引用一個對象,而大力對象可以再客戶和目標對象之間起到中介作用,去掉客戶不能看到的內容和服務或者增添客戶需要的額外服務。(很難記就是了,但是通過代碼來體現他的定義,我認爲更加直觀和容易記住)
2.一些UML圖和結構圖(大致看一看就好,瞭解一個思想)
UML圖:
結構圖:
我們通過一些代碼簡單的展示一下代理模式的作用,比如說我們希望通過一個日誌記錄調用某個方法的一些細節,比如傳入的參數,方法執行的時間等等。
如果不使用代理模式,這種日誌的記錄就會干涉到我們的業務邏輯,如:
這是我們的抽象方法接口:
public interface MyInterface {
//這個方法實現我們的業務邏輯
public void doOperation();
}
這是我們的實現:(我們就單純的打印一些語句就好)
/*
* 不使用代理類實現接口,只是單純的實現接口需要做的操作
*/
public class RealClass implements MyInterface{
//在這裏實現我們的業務邏輯
@Override
public void doOperation() {
doBefore();//記錄方法的開始
System.out.println("doOperation...");
doAfter();//記錄方法的結束
}
}
我們調用這個方法時:
public class ProxyTest {
public static void main(String[] args){
//不使用代理模式
RealClass realObj = new RealClass();
realObj.doOperation();
//使用代理模式
//ProxyClass proxyObj = new ProxyClass(new RealClass());
//proxyObj.doOperation();
}
}
很明顯,這種實現就會干涉到我們正常的業務邏輯
然而通過代理模式,我們可以這樣實現:
public class ProxyClass implements MyInterface{
private MyInterface realObj;
public ProxyClass(MyInterface realObj){
this.realObj = realObj;
}
@Override
public void doOperation() {
doBefore();
realObj.doOperation();
doAfter();
}
//記錄方法執行的開始
private void doBefore(){
System.out.println("doBefore");
}
//記錄方法執行的結束
private void doAfter(){
System.out.println("doAfter");
}
}
public class ProxyTest {
public static void main(String[] args){
//不使用代理模式
//RealClass realObj = new RealClass();
//realObj.doOperation();
//使用代理模式
ProxyClass proxyObj = new ProxyClass(new RealClass());
proxyObj.doOperation();
}
}
我們看到,儘管看起來是代理類完成了相應的工作,但是實際上在代理類的內部,還是之前的實現類完成了相應的工作,只不過通過代理模式我們剝離出來和業務邏輯無關的方法罷了。
不過,這也是代理模式的一個簡單的應用,如果有什麼問題,希望大家提出來!