1. 程式人生 > >設計模式之代理模式簡單實現

設計模式之代理模式簡單實現

簡介

  • 代理模式通常用於達到對原有系統功能進行擴充的目的,比如:你剛接手一個別人沒有完成的專案,這時你不想動別人原來的程式碼,還需要新增新功能。這時代理模式,這時代理模式會很好的幫我們解決問題
  • 代理模式一般分為靜態代理,動態代理兩種

靜態代理

靜態代理一般是由一個介面、若干實現類、若干代理類構成。

程式碼實現

先定義一個介面

public interface IFilmStar {
	 void kungFu() ;
}

定義它的實現類(真實類)

public class FilmStarImpal1 implements IFilmStar {
	@Override
	public void kungFu() {
		System.out.println("成龍");
	}

}

定義它的代理類,在靜態代理中他的代理類和實現類都是實現了同一個介面

public class FilmStarImpl implements IFilmStar {
	private FilmStarImpal1 dd;    //定義一個私有
	public FilmStarImpl(FilmStarImpal1 dd) {
		this.dd=dd;
	}
	@Override
	public void kungFu() {
		this.dd.kungFu();
	}
}

定義一個測試類

public class Test {
	public static void main(String[] args) {
		FilmStarImpl f = new FilmStarImpl(new FilmStarImpal1());
		f.kungFu();
	}
}

上面就構成了一個最簡單的靜態代理模式,代理類聚合了被代理類,且代理類及被代理類都實現了同一個介面,可實現靈活多變。繼承式的實現方式則不夠靈活。
缺點就是如果在追加兩個功能那麼還需要在建立兩個代理類,這樣就會導致代理類越來越多,管理越來越困難。這是動態代理就運用而生了

動態代理

學習動態代理,不可避免的要用到下面一個介面和一個類。

  1. InvocationHandler介面
  2. Proxy類

下面進行一個簡單的程式碼實現,為了方便就只用了一個功能介面(沒有凸顯出動態代理的靈活性)

定義介面

public interface IFilmStar {
	public void kungFu() ;
}

定義實現類(真實類)

public class FilmStar implements IFilmStar {
	@Override
	public void kungFu() {
		System.out.println("FilmStar.kungFu()");
	}
}

定義InvocationHandler介面的實現類

public class sss implements InvocationHandler {
	private Object temp;  //真實物件
	public sss(Object temp) {
		this.temp = temp;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {   //proxy 表示代理物件,method 表示被代理的真實物件的方法,args表示方法對應的引數
		method.invoke(temp, args);
		return null;
	}
}

定義測試類

public class Tets {
	public static void main(String[] args) {
		IFilmStar temp =  (IFilmStar) Proxy.newProxyInstance(IFilmStar.class.getClassLoader(), new Class[] 	{IFilmStar.class}, new sss(new FilmStar()));     //三個引數分別是 類載入器、真實物件實現的所有介面以及對應的代理InvocationHandler
		temp.kungFu();
	}
}

動態代理與靜態代理相比較,最大的好處是介面中宣告的所有方法都被轉移到呼叫處理器一個集中的方法中處理。在介面方法數量比較多的時候,我們可以進行靈活處理,而不需要像靜態代理那樣對每一個方法或方法組合進行處理