設計模式之代理模式
代理模式,我想大家一聽表麵的意思能得到一些信息,就是代理工作,為什麼會產生這種模式呢?因為它可以使麵向對象的複用性和靈活性增強。用一個很形象的例子來說明一下,比如說一張支票或銀行匯票是對一個賬戶上資金的代理,支票能代替現金購買,最終能控製訪問開證人賬戶上的現金,如果我們拿幾車現金去購買東西,豈不是很費力,而用一張小小的支票代理就完全搞定了。
下麵是代理模式的結構圖:
用一個簡單的結構圖描述就是:
用代碼表示這種圖如下:
class Program { static void Main(string[] args) { Proxy proxy=new Proxy (); proxy .Request (); Console.Read (); } abstract class Subject { public abstract void Request() } class RealSubject:Subject { Console .Writeline("真實請求"); } class Proxy:Subject { RealSubject realsubject; public override void Request() { if (realsubject==null ) { realsubject=new RealSubject (); } realsubject .Request (); } } }代理在實際中的應用:
一、遠程代理:為一個位於不同的地址空間的對象提供一個本地的代理對象。這個不同的地址空間可以是在同一台主機中,也可是在另一台主機中,遠程代理又叫做大使(Ambassador),用一個形象的圖表示一下:
二、虛擬代理:根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的真實對象。應用虛擬代理就是先創建一個消耗小的對象來代理,需要的時候再真實創建,比如淘寶中的那些小圖片,很容易加載的,如果我們看到的是直接的某件商品,淘寶上無數的商品不知道要加載到何時才能加載完全,而用代理的小圖標後,隻有我們點擊了某個小圖標後才會創建真實的商品以及它的詳細情況。
三、安全代理:用來控製真實對象訪問時的權限。一般用於對象有不同的訪問權限時。
四、智能指引:當調用真實對象時,代理處理另外一些事。它取代了指針,在訪問對象時附加一些操作,比如第一次引用一個持久對象時,將它裝入內存。
最後用書中的一個實例來演示一下:
- //代理接口
- public interface GiveGift
- {
- void giveDolls();
- void giveFlowers();
- void giveChocolate();
- }
- //追求者類
- public class Pursuit implements GiveGift
- {
- SchoolGirl mm;
- public Pursuit(SchoolGirl mm)
- {
- this.mm = mm;
- }
- public void giveDolls()
- {
- System.out.println(mm.name + " 送你洋娃娃");
- }
- public void giveFlowers()
- {
- System.out.println(mm.name + " 送你鮮花");
- }
- public void giveChocolate()
- {
- System.out.println(mm.name + " 送你巧克力");
- }
- }
- //代理類
- public class Proxy implements GiveGift
- {
- Pursuit gg;
- public Proxy(SchoolGirl mm)
- {
- gg = new Pursuit(mm);
- }
- public void giveChocolate()
- {
- gg.giveChocolate();
- }
- public void giveDolls()
- {
- gg.giveDolls();
- }
- public void giveFlowers()
- {
- gg.giveFlowers();
- }
- }
- //客戶端代碼
- public class Main
- {
- public static void main(String[] args)
- {
- SchoolGirl jiaojiao = new SchoolGirl();
- jiaojiao.setName("李嬌嬌");
- Proxy daili = new Proxy(jiaojiao);
- daili.giveDolls();
- daili.giveFlowers();
- daili.giveChocolate();
- }
最後更新:2017-04-03 12:55:04