設計模式-代理模式

設計模式的學習與使用在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();
	}
}
我們看到,儘管看起來是代理類完成了相應的工作,但是實際上在代理類的內部,還是之前的實現類完成了相應的工作,只不過通過代理模式我們剝離出來和業務邏輯無關的方法罷了。

不過,這也是代理模式的一個簡單的應用,如果有什麼問題,希望大家提出來!




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