代理模式我想大家即便不熟悉也都聽過吧,從字面意思上看就是替別人幹活的,比如代理商。在項目的實際應用中也有很多地方用到,比如spring通過代理模式生成對象等。
代理模式的書面定義:爲其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
在《《大話設計模式》》一書中以一個有男朋友的女孩讓“小菜”幫忙修電腦的故事展開的,其實說白了代理就是幫別人幹活的,一般老闆不出面,都是小弟幫忙做交易。代理模式很好理解也很好懂,那就直接來代碼吧
1、要追求的姑娘
/*
* 被追求的女孩
*/
publicclass Girl {
private String name;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
}
2、真正的追求者
/*
* 真實的追求者
*/
publicclass Pursuit implements GiveGift {
//禮物當然送給女孩了
protected Girl girl;
public Pursuit(Girl girl){
this.girl = girl;
}
publicvoid giftChocolate() {
// TODO Auto-generated method stub
System.out.println("送巧克力給"+girl.getName());
}
publicvoid giftFlowers() {
// TODO Auto-generated method stub
System.out.println("送花給"+girl.getName());
}
}
3、代理中間人
/*
* 代理類
*/
publicclass Proxy implements GiveGift {
protected Pursuit pursuit;
//畢竟是代理,真正的還是追求者與女孩的聯繫
public Proxy(Girl girl){
pursuit = new Pursuit(girl);
}
publicvoid giftChocolate() {
// TODO Auto-generated method stub
pursuit.giftChocolate();
}
//花其實是追求者的
publicvoid giftFlowers() {
// TODO Auto-generated method stub
pursuit.giftFlowers();
}
}
4、客戶端
publicclass ProxyClient {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Girlgirl = new Girl();
girl.setName("妹妹");
//真正操作的是代理
Proxyproxy = new Proxy(girl);
proxy.giftChocolate();
proxy.giftFlowers();
}
}
代理模式都在什麼場合應用呢?(摘自網絡)
1) 遠程代理(Remote Proxy)爲一個位於不同的地址空間的對象提供一個本地的代理對象。這個不同的地址空間可以是在同一臺主機中,也可是在另一臺主機中,遠程代理又叫做大使(Ambassador)
2) 虛擬代理(Virtual Proxy)根據需要創建開銷很大的對象。如果需要創建一個資源消耗較大的對象,先創建一個消耗相對較小的對象來表示,真實對象只在需要時纔會被真正創建。
3) 保護代理(Protection Proxy)控制對原始對象的訪問。保護代理用於對象應該有不同的訪問權限的時候。
4) 智能指引(Smart Reference)取代了簡單的指針,它在訪問對象時執行一些附加操作。
5) Copy-on-Write代理:它是虛擬代理的一種,把複製(克隆)操作延遲到只有在客戶端真正需要時才執行。一般來說,對象的深克隆是一個開銷較大的操作,Copy-on-Write代理可以讓這個操作延遲,只有對象被用到的時候才被克隆。
總結:本章代理模式很好理解,代碼也非常簡單,在這裏說一下它的有點吧。職責清晰,真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了的作用和保護了目標對象的作用。還有就是高擴展性