代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式:
人如其名,代理相信大家都可以經常看到什么什么代理,現實中代理太多了。感受最真實的是火車票的代理,經常可以在街上看到,你買票的是在代理商買的,但是付的錢依然會交給鐵大哥,這就是代理。現實中的你可能會接觸的例子就是叫同學去給你買票,實際上不是你去買,但是是票是你的。這也是代理。
代理模式組成:
抽象角色:通過接口或抽象類聲明真實角色實現的業務方法。
代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。
真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。
代理的UML圖

代理的優點:
(1).職責清晰 真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過后期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。叫你去買票,我管你有沒有摔跤撒的,不需要關注這種問題。
(2).代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。別人在路上一看,以為是你同學要買票去哪里,實際上買的是你的,保護了你。
(3).高擴展性 只要符合火車站規定的人,同學都可以去代人買票。
下面就用代碼來實現着一個過程。
1 package com.roc.prory; 2 3 /** 4 * 定義一個種類的人 抽象角色 5 * 6 * @author liaowp 7 * 8 */ 9 public interface Person { 10 11 /** 12 * 可以去火車站買票 13 */ 14 public void buyTicket(); 15 16 }
package com.roc.prory; /** * 小王 代理角色 * @author liaowp * */ public class XiaoWang implements Person { private Person person = null;//默認就是一個人 public XiaoWang(){//小王比較聰明,知道帶別人買票賺錢。默認是只賺小明的錢 this.person = new XiaoMing(); } public XiaoWang(Person per){//賺小明的不夠,只要是人就賺。 this.person = per; } /** * 小王也是人,也可以去買票。 */ public void buyTicket() {//調不然方法去買票,代理商 this.person.buyTicket(); } }
package com.roc.prory; /** * 小明 真實角色 * @author liaowp * */ public class XiaoMing implements Person { //比較懶 /* * 小明也是人,也可以去買票。 * @see com.roc.prory.Person#buyTicket() */ @Override public void buyTicket() { System.out.println("買小明的票"); } }
package com.roc.prory; /** * 小麗 * @author liaowp * */ public class XiaoLi implements Person { /** * 小麗也可以自己買票。 */ public void buyTicket() { System.out.println("買小麗的票"); } }
package com.roc.prory; /** * 測試代理模式 * @author liaowp * */ public class Client { public static void main(String[] args) { XiaoWang xiaoWang = new XiaoWang();//new 的小王 xiaoWang.buyTicket();//小王去買了小明的票,這就是代理 XiaoLi xiaoLi = new XiaoLi();//買票也要有這個人呀。先把小麗 new 出來。 XiaoWang mrWang = new XiaoWang(xiaoLi);//小麗說:小王幫我去買個票唄 mrWang.buyTicket();//屁顛屁顛的跑去買了 } }