代理模式(靜態代理)

代理模式中,生活中仍是比較常見的,可是此次我想舉個比較接地氣的例子,嘿嘿嘿..雖然有點污,可是我的以爲還算是比較接地氣吧,下面就來看看吧.....

 

 

水滸傳你們應該都看過吧,其中潘金蓮跟西門慶是怎麼勾搭在一塊兒的,經過王婆對吧,就是由於王婆的牽線搭橋,才讓西門慶跟潘金蓮勾搭在一塊兒的,那麼,咱們就能夠當作,王婆是潘金蓮的代理,西門慶經過訪問王婆,獲得了潘金蓮,作了苟且之事,咱們先定義一個接口,叫作 BadWoman

public interface BadWoman {
    //拋媚眼
	void makeEyesWithMan();
    //嘿嘿嘿
	void happyTimeWithMan();
}

 

 

接着定義一個潘金蓮,實現BadWoman接口,做爲被代理者,由王婆來代理潘金蓮跟誰作苟且之事

public class PanJinLian implements BadWoman {
	@Override
	public void makeEyesWithMan() {
		System.out.println("潘金蓮,拋媚眼");
	}

	@Override
	public void happyTimeWithMan() {
		System.out.println("潘金蓮...嘿嘿嘿...");
	}
}

 

而後在定義一個王婆,實現BadWoman接口,由於代理者要知道被代理者作什麼操做,確定要實現共同接口來保證能代理者的行爲

public class WangPo implements BadWoman {
    //經過多態進行代理
	private BadWoman badWoman;

    //默認給潘金蓮代理
	public WangPo() {
		this.badWoman = new PanJinLian();
	}

    //能夠替換被代理者
	public WangPo(BadWoman badWoman) {
		this.badWoman = badWoman;
	}

    //調用的是王婆的拋媚眼方法,實際上執行者是被代理者
	@Override
	public void makeEyesWithMan() {
		badWoman.makeEyesWithMan();
	}

    //跟拋媚眼同樣
	@Override
	public void happyTimeWithMan() {
		badWoman.happyTimeWithMan();
	}
}

 

 

最後,咱們在定義一個西門慶,來調用代理者(王婆)跟西門慶作苟且之事

public class XiMenQing {

	public static void main(String[] args){
		System.out.println("呼叫王婆..");
		WangPo wangPo = new WangPo();

		wangPo.makeEyesWithMan();
		wangPo.happyTimeWithMan();
	}
}

 

能夠看到,雖然調用的是代理者王婆,可是實際上執行者是潘金蓮,這個西門慶可不知道,他只知道,他調用的是王婆的方法,並且,經過代理模式,咱們能夠增強對代理者的訪問,在代理者調用被代理者行爲前,作一些其它的處理,例如: 增長參數處理,打印等等...並且咱們要替換代理者也很容易,具體以下java

 

 

咱們能夠試試替換下王婆的被代理者,由潘金蓮變成賈氏,咱們定義一個賈氏,也實現BadWoman接口編程

public class JiaShi implements BadWoman {
	@Override
	public void makeEyesWithMan() {
		System.out.println("賈氏拋媚眼");
	}

	@Override
	public void happyTimeWithMan() {
		System.out.println("賈氏..嘿嘿嘿...");
	}
}

 

而後西門慶類增長下代碼,替換掉王婆默認的被代理者

public class XiMenQing {

	public static void main(String[] args){
		System.out.println("呼叫王婆..");
		JiaShi jiaShi = new JiaShi();
		WangPo wangPo = new WangPo(jiaShi);

		wangPo.makeEyesWithMan();
		wangPo.happyTimeWithMan();
	}
}

 

這樣,咱們用最小的代價完成了被代理者的替換,並且,代碼耦合度低,替換被代理者只需換個實現,並且能夠增強被代理者的訪問,其它地方的代碼都不須要變更,讀者說若是你說: 我就須要變更,你打我!  筆者:來,你過來,我給你看個板磚,你那麼多地方要變更,改不死你,面向接口編程的原則你忘了?最後是UML類圖app

 

 

 

 

到這,文章就結束了!ide

以上,均爲本人我的理解,比較簡單的理解,或許跟各位看官理解的有出入,歡迎指正交流this

歡迎轉載,請註明出處跟做者,謝謝!spa

相關文章
相關標籤/搜索