乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      深入理解設計模式(23):代理模式

       新進小設計 2020-07-11

      一、引言

        我們都知道,數(shù)據(jù)庫連接是很珍貴的資源,頻繁的開關數(shù)據(jù)庫連接是非常浪費服務器的CPU資源以及內(nèi)存的,所以我們一般都是使用數(shù)據(jù)庫連接池來解決這一問題,即創(chuàng)造一堆等待被使用的連接,等到用的時候就從池里取一個,不用了再放回去,數(shù)據(jù)庫連接在整個應用啟動期間,幾乎是不關閉的,除非是超過了最大閑置時間。

        但是在程序員編寫程序的時候,會經(jīng)常使用connection.close()這樣的方法,去關閉數(shù)據(jù)庫連接,而且這樣做是對的,所以你并不能告訴程序員們說,你們使用連接都不要關了,去調(diào)用一個其他的類似歸還給連接池的方法吧。這是不符合程序員的編程思維的,也很勉強,而且具有風險性,因為程序員會忘的。

        解決這一問題的辦法就是使用代理模式,因為代理模式可以替代原有類的行為,所以我們要做的就是替換掉connection的close行為。

      二、什么是代理模式

      代理模式——就是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程序的一個代理。

      三、代理模式的結構

       

        (1) Subject(抽象主題角色):它聲明了真實主題和代理主題的共同接口,這樣一來在任何使用真實主題的地方都可以使用代理主題,客戶端通常需要針對抽象主題角色進行編程。

             (2) Proxy(代理主題角色):它包含了對真實主題的引用,從而可以在任何時候操作真實主題對象;在代理主題角色中提供一個與真實主題角色相同的接口,以便在任何時候都可以替代真實主題;代理主題角色還可以控制對真實主題的使用,負責在需要的時候創(chuàng)建和刪除真實主題對象,并對真實主題對象的使用加以約束。通常,在代理主題角色中,客戶端在調(diào)用所引用的真實主題操作之前或之后還需要執(zhí)行其他操作,而不僅僅是單純調(diào)用真實主題對象中的操作。

             (3) RealSubject(真實主題角色):它定義了代理角色所代表的真實對象,在真實主題角色中實現(xiàn)了真實的業(yè)務操作,客戶端可以通過代理主題角色間接調(diào)用真實主題角色中定義的操作。

      四、代理模式和裝飾模式的異同

      代理模式和裝飾模式的代碼實現(xiàn)方式很相同,主要不同點是代理模式關注與被代理對象行為的控制,然而裝飾模式關注于在一個對象上動態(tài)的添加方法。

      代理模式可以對客戶端隱藏被代理對象的具體實現(xiàn),代理模式的時候常常是在一個代理類中創(chuàng)建一個對象的實例,當使用裝飾模式的時候,將原始對象轉(zhuǎn)為一個參數(shù)傳遞給裝飾者的構造器中

      代理模式強調(diào)的是限制,裝飾模式強調(diào)的是增強

      五、代理模式和委托

            代理:是把一些事情交給某人幫忙去完成。

            委托:是當某件事情發(fā)生的時候,順便干某件事情。委托就相當于一個觸發(fā)器罷了。

      六、代理模式的種類

      在實際開發(fā)過程中,代理類的實現(xiàn)比上述代碼要復雜很多,代理模式根據(jù)其目的和實現(xiàn)方式不同可分為很多種類,其中常用的幾種代理模式簡要說明如下:

             (1) 遠程代理(Remote Proxy):為一個位于不同的地址空間的對象提供一個本地的代理對象,這個不同的地址空間可以是在同一臺主機中,也可是在另一臺主機中,遠程代理又稱為大使(Ambassador)。

             (2) 虛擬代理(Virtual Proxy):如果需要創(chuàng)建一個資源消耗較大的對象,先創(chuàng)建一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正創(chuàng)建。

             (3) 保護代理(Protect Proxy):控制對一個對象的訪問,可以給不同的用戶提供不同級別的使用權限。

             (4) 緩沖代理(Cache Proxy):為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。

             (5) 智能引用代理(Smart Reference Proxy):當一個對象被引用時,提供一些額外的操作,例如將對象被調(diào)用的次數(shù)記錄下來等。

      七、代理模式的應用場景

       代理模式的類型較多,不同類型的代理模式有不同的優(yōu)缺點,它們應用于不同的場合:

             (1) 當客戶端對象需要訪問遠程主機中的對象時可以使用遠程代理。

             (2) 當需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,從而降低系統(tǒng)開銷、縮短運行時間時可以使用虛擬代理,例如一個對象需要很長時間才能完成加載時。

             (3) 當需要為某一個被頻繁訪問的操作結果提供一個臨時存儲空間,以供多個客戶端共享訪問這些結果時可以使用緩沖代理。通過使用緩沖代理,系統(tǒng)無須在客戶端每一次訪問時都重新執(zhí)行操作,只需直接從臨時緩沖區(qū)獲取操作結果即可。

             (4) 當需要控制對一個對象的訪問,為不同用戶提供不同級別的訪問權限時可以使用保護代理。

             (5) 當需要為一個對象的訪問(引用)提供一些額外的操作時可以使用智能引用代理。

      八、代理模式的優(yōu)缺點

      優(yōu)點:

         (1) 能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度。

             (2) 客戶端可以針對抽象主題角色進行編程,增加和更換代理類無須修改源代碼,符合開閉原則,系統(tǒng)具有較好的靈活性和可擴展性。

      缺點:

         (1) 由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢,例如保護代理。

             (2) 實現(xiàn)代理模式需要額外的工作,而且有些代理模式的實現(xiàn)過程較為復雜,例如遠程代理。

      九、代理模式的實現(xiàn)


      class
      SchoolGirl //定義 女孩類 { private string name; public string Name { get { return name; } set { name = value; } } }
      //抽象主題類聲明了真實主題類和代理類的公共方法,它可以是接口、抽象類或具體類,客戶端針對抽象主題類編程,一致性地對待真實主題和代理主題,
      interface
      IGiveGift //創(chuàng)建一個送禮物的接口 { void GiveDolls(); void GiveFlowers(); void GiveChocolate(); }
      
      
      //真實主題類繼承了抽象主題類,提供了業(yè)務方法的具體實現(xiàn),
      class Pursuit:IGiveGift     //追求者類,使用送禮物的接口
          {
              SchoolGirl mm;          //要追求女孩的名字
              public Pursuit(SchoolGirl mm)
              {
                  this.mm = mm;
              }
              public void GiveDolls()
              {
                  Console.WriteLine(mm.Name+"送你洋娃娃");
              }
              public void GiveFlowers()
              {
                  Console.WriteLine(mm.Name + "送你花");
              }
              public void GiveChocolate()
              {
                  Console.WriteLine(mm.Name + "送你巧克力");
              }
          }
      //代理類也是抽象主題類的子類,它維持一個對真實主題對象的引用,調(diào)用在真實主題中實現(xiàn)的業(yè)務方法,在調(diào)用時可以在原有業(yè)務方法的基礎上附加一些新的方法來對功能進行擴充或約束,
      class
      Proxy : IGiveGift //定義代理模式,也用送禮物的接口 { Pursuit gg; public Proxy(SchoolGirl mm) //區(qū)別在于,代替追求者 送禮物 { gg=new Pursuit(mm); } public void GiveDolls() { gg.GiveDolls(); } public void GiveFlowers() { gg.GiveFlowers(); } public void GiveChocolate() { gg.GiveChocolate(); } }
      class Program
          {
              static void Main(string[] args)
              {
                  SchoolGirl mm = new SchoolGirl();
                  mm.Name = "hanmeimei";
      
                  Proxy daili = new Proxy(mm);
      
                  daili.GiveDolls();
                  daili.GiveFlowers();
                  daili.GiveChocolate();
              }
          }

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多