1. 程式人生 > ><四>讀<<大話設計模式>>之代理模式

<四>讀<<大話設計模式>>之代理模式

flow 編程 運行 應該 nts popu rac gif 通過

代理模式我想大家即便不熟悉也都聽過吧,從字面意思上看就是替別人幹活的,比方代理商。在項目的實際應用中也有非常多地方用到。比方spring通過代理模式生成對象等。

代理模式的書面定義:為其它對象提供一種代理以控制對這個對象的訪問。

在某些情況下,一個對象不適合或者不能直接引用還有一個對象,而代理對象能夠在client和目標對象之間起到中介的作用。

《《大話設計模式》》一書中以一個有男朋友的女孩讓“小菜”幫忙修電腦的故事展開的,事實上說白了代理就是幫別人幹活的,一般老板不出面,都是小弟幫忙做交易。代理模式非常好理解也非常好懂,那就直接來代碼吧

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、client

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代理:它是虛擬代理的一種,把復制(克隆)操作延遲到僅僅有在client真正須要時才運行。一般來說,對象的深克隆是一個開銷較大的操作,Copy-on-Write代理能夠讓這個操作延遲。僅僅有對象被用到的時候才被克隆。

總結:本章代理模式非常好理解。代碼也非常easy。在這裏說一下它的有點吧。職責清晰,真實的角色就是實現實際的業務邏輯。不用關心其它非本職責的事務,通過後期的代理完畢一件完畢事務,附帶的結果就是編程簡潔清晰。

代理對象能夠在client和目標對象之間起到中介的作用,這樣起到了的作用和保護了目標對象的作用。

還有就是高擴展性

<四>讀<<大話設計模式>>之代理模式