java設計模式
Proxy
: 代理人——代替別人工作的人
“本人”尋找“代理人”工作,但是代理人畢竟是代理人蔚晨,能代替本人所做的事有限,當代理人無法幫忙時再尋找本人
RealSubject:真實角色,是實現(xiàn)抽象接口的類献起。
Proxy:代理角色,內部含有對真實對象RealSubject的引用
镣陕,從而可以操作真實對象谴餐。代理對象提供與真實對象相同的接口,以便在任何時刻都能代替真實對象呆抑。同時岂嗓,代理對象可以在執(zhí)行真實對象操作時,附加其他的操作鹊碍,相當于對真實對象進行封裝厌殉。
Subject : 接口,是對象和它的代理共用
的接口侈咕,讓RealSubject和Proxy具有一致性公罕。
1.抽象接口
public interface Subject {
void setNumber(int number);//代理人可以幫忙做的事
int getNumber();//代理人可以幫忙做的事
void displayNumber();//只有本人才能做的事
}
2.真實類
public class RealSubject implements Subject {
private int number;
public RealSubject(){
System.out.println("正在生成本人實例");
}//非參構造函數(shù)
public RealSubject(int number){
this.number = number;
System.out.println("正在生成本人實例");
}//構造函數(shù)
@Override
public void setNumber(int number) {
this.number = number;
}
@Override
public int getNumber() {
return number;
}
@Override
public void displayNumber() {
System.out.println("只有本人才能做的事 :");
System.out.println(number);
}//只有本人才能做的事
}
3.代理類
public class Proxy implements Subject {
private RealSubject realSubject;//本人。代理人持有本人的引用耀销,當代理人無法完成要求時楼眷,再生成本人
private int number;
public Proxy(int number){
this.number = number;
}
@Override
public void setNumber(int number) {
if(realSubject != null){
//當本人不是null,則說明以及生成了本人的實例化對象熊尉,這時就可以直接讓本人操作了
realSubject.setNumber(number);
}
this.number = number;
}
@Override
public int getNumber() {
return number;
}
@Override
public void displayNumber() {
//這件事只用又本人來做罐柳,所以要生成“本人”
realize();
realSubject.displayNumber();
}
private void realize(){
if(realSubject == null){
realSubject = new RealSubject();
}
}
}
4.測試
public class Main {
public static void main(String[] args) {
Subject subject = new Proxy(5);
System.out.println("現(xiàn)在的數(shù)字是 :" + subject.getNumber());//獲得數(shù)字代理即可完成
subject.setNumber(12);//設置數(shù)字,代理也可以完成
System.out.println("設置后的數(shù)字是 :" + subject.getNumber());//獲得數(shù)字代理即可完成
System.out.println("打印出數(shù)字(只能由本人完成)");
subject.displayNumber();
}
}
5.運行結果
優(yōu)點
使用Proxy角色帽揪,使得耗時處理(生成實例)推遲硝清。
在大型系統(tǒng)的初始化過程中,存在大量耗時處理转晰,如果初始化暫時不會使用的功能芦拿,會使啟動時間延長,所以使用代理模式查邢,先初始化需要使用的功能
代理與委托
當遇到代理人不會解決的問題時蔗崎,還是會“轉交”給本人——“委托”(現(xiàn)實世界中是本人委托給代理人,在設計模式中卻相反)
HTTP代理
Web瀏覽器訪問Web頁面扰藕,不會每次都訪問遠程Web服務器來獲取頁面內容缓苛,而是先獲取HTTP代理緩存的頁面。只有當需要新的頁面或者是頁面緩存過期才去訪問遠程Web服務器
Web服務器:Client角色,HTTP代理:Proxy角色未桥,Web服務器:RealSubject角色