日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)其它知識 → 使用代理模式模擬ORM實體的延時加載

      使用代理模式模擬ORM實體的延時加載

      相關(guān)軟件相關(guān)文章發(fā)表評論 來源:海島孤雁時間:2011/7/31 23:41:20字體大。A-A+

      作者:海島孤雁點擊:26次評論:0次標(biāo)簽: ORM

      ORM一鍵還原系統(tǒng)V4.1.29.1 官方最新版
      • 類型:備份還原大小:8.8M語言:中文 評分:10.0
      • 標(biāo)簽:
      立即下載

      .NET中的Entity Framework 和 java里面的 Hibernate都是ORM框架,它們中間都用到延時加載,延時加載對于提高性能,減小服務(wù)器內(nèi)存壓力有很大的作用。所謂延時加載,就是只有在第一次調(diào)用某個實體的方法或?qū)傩詴r才初始化該實體。延時加載適用于創(chuàng)建開銷大的對象。如下,我采用代理模式模擬了一個簡單的延時加載的例子。

      首先,我定義了一個接口,名為IOperation,定義如下:


       1 public interface IOperation
       2 {
       3     /// <summary>
       4     /// 聲明一個描述類信息的方法,由子類實現(xiàn)。
       5     /// </summary>
       6     void Describe();
       7     /// <summary>
       8     /// 聲明一個銷毀訂單的操作,由子類操作
       9     /// </summary>
      10     void DestoryOrder();
      11 }



           然后定義兩個實體類,Product類和Order類,分別表示兩個相互關(guān)聯(lián)的實體,在Product類中注入Order類的變量用以在Product類中調(diào)用Order類的實例方法。并且讓Product類實現(xiàn)IOperate接口。

      Product類定義如下:


       1 public class Product : IOperation
       2 {
       3     private Order _order;
       4     public Product()
       5     {
       6         Console.WriteLine(">>開始初始化Product類...");
       7         Stopwatch sw = new Stopwatch();
       8         sw.Start();
       9         this._order = new Order();
      10         sw.Stop();
      11         Console.WriteLine(">>初始化Product類完成。耗時:{0}秒", sw.ElapsedMilliseconds / 1000);
      12     }
      13     public void Describe()
      14     {
      15         Console.WriteLine(">>Product描述:我的是Product類的實例,Describe方法執(zhí)行完成。");
      16     }
      17     public void DestoryOrder()
      18     {
      19         Console.WriteLine(">>Product.DestoryOrder()方法開始執(zhí)行...");
      20         if (_order != null)
      21         {
      22             //調(diào)用Order類的Destroy實例方法,銷毀自己。
      23             _order.Destroy();
      24             Console.WriteLine(">>Product.DestoryOrder()方法執(zhí)行完成。");
      25         }
      26     }
      27 }



      Order類定義如下: 


       1 public class Order
       2 {
       3     public Order()
       4     {
       5         Console.WriteLine(">>開始初始化Order類...");
       6         System.Threading.Thread.Sleep(5000);
       7         Console.WriteLine(">>初始化Order類完成。");
       8     }
       9 
      10     public void Destroy()
      11     {
      12         Console.WriteLine(">> Order 已銷毀。");
      13     }
      14 }

      然后在主程序里面調(diào)用一下:


       1 static void Main(string[] args)
       2 {
       3     Console.WriteLine("==========不使用代理類調(diào)用Describe()方法===============");
       4     Product p = new Product();
       5     p.Describe();
       6     Console.WriteLine("==========不使用代理類調(diào)用DestoryOrder()方法===============");
       7     Product p2 = new Product();
       8     p2.DestoryOrder();
       9     Console.ReadKey();
      10 }

      >

      測試結(jié)果如下:

      從上圖中,我們可以看出,調(diào)用Describe()方法初始化Product類用了5秒,這是不是有問題?再看看上面的Describe()方法的實現(xiàn),只簡單的輸出了一句話,怎么會用5秒?再看Product的構(gòu)造函數(shù)里面,在初始化Product類的實例的時候,把Order類也初始化了,但是我這個Describe()方法并沒有調(diào)用Order類的任何方法和屬性,所以這就造成了不必要的內(nèi)存開銷,而且初始化了的Order類的實例也沒有使用,產(chǎn)生了垃圾對象。

            怎么解決這個問題呢?所以這個地方就得用代理了,代理是個什么東西呢?代理簡單來說,就是制造一個與被調(diào)對象具有相同功能(這個相同功能通常由接口去規(guī)范)的類,在這個類中可以調(diào)用被調(diào)對象的方法,也可以自定義新的方法供調(diào)用方使用。下面就是代理類的創(chuàng)建。

      首先,我創(chuàng)建一個代理類,名為ProxyProduct,讓它也實現(xiàn)IOperate接口,定義如下:


       1public class ProxyProduct : IOperation
       2{
       3    private IOperation entity;
       4
       5    public ProxyProduct(IOperation entity)
       6    {
       7        Console.WriteLine(">>開始初始化ProxyProduct...");
       8        Stopwatch sw = new Stopwatch();
       9        sw.Start();
      10        this.entity = entity;
      11        sw.Stop();
      12        Console.WriteLine(">>初始化ProxyProduct完成。耗時:{0}秒", sw.ElapsedMilliseconds / 1000);
      13    }
      14    /// <summary>
      15    /// 實現(xiàn)IOperation的方法
      16    /// </summary>
      17    public void Describe()
      18    {
      19        Console.WriteLine(">>ProxyProduct描述:我的是ProxyProduct類的實例,Describe()方法執(zhí)行完成。");
      20    }
      21    /// <summary>
      22    /// 實現(xiàn)IOperation的方法
      23    /// </summary>
      24    public void DestoryOrder()
      25    {
      26        Console.WriteLine(">>ProxyProduct.DestoryOrder()方法開始執(zhí)行...");
      27        if (entity == null)
      28        {
      29            entity = new Product();
      30        }
      31        entity.DestoryOrder();
      32        Console.WriteLine(">>ProxyProduct.DestoryOrder()方法執(zhí)行完成。");
      33    }
      34}



      在主程序里面測試一下:


       1 static void Main(string[] args)
       2 {
       3     Console.WriteLine("==========使用代理類調(diào)用Describe()方法===============");
       4     IOperation desc = new ProxyProduct(null) as IOperation;
       5     if (desc != null)
       6     {
       7         desc.Describe();
       8     }
       9     Console.WriteLine("==========使用代理類調(diào)用DestoryOrder()方法===============");
      10     IOperation desc2 = new ProxyProduct(null) as IOperation;
      11     if (desc2 != null)
      12     {
      13         desc2.DestoryOrder();
      14     }
      15     Console.ReadKey();
      16 }

      測試結(jié)果如下:

            從上圖看出,調(diào)用Describe()方法時耗時0秒,調(diào)用DestoryOrder()方法時,初始化代理類用了0秒,初始化Product類用了5秒,所以執(zhí)行DestroyOrder()方法一共花費了5秒。這樣的結(jié)果是令人滿意的,使用代理類就實現(xiàn)了“調(diào)用誰的方法,就初始化誰;不調(diào)用不初始化”的想法。這樣的話,如果我永遠(yuǎn)只調(diào)Describe()方法,那么我花費的時間永遠(yuǎn)是0秒,而不會產(chǎn)生額外的開銷,這對性能優(yōu)化有很大的幫助。

            總結(jié):代理模式應(yīng)用之一:對于某些創(chuàng)建時需要很大開銷的對象,我們可以使用代理讓這個對象在第一次調(diào)用它的方法或?qū)傩詴r才創(chuàng)建它的實例,不調(diào)用它的方法或?qū)傩詣t永遠(yuǎn)不創(chuàng)建它的實例。好處:性能優(yōu)化,減小內(nèi)存開銷。

       ==================================================================================================================
      如下是java代碼實現(xiàn):
      接口:IOperate


       1 public interface IOperate {
       2     /**
       3      * 聲明一個描述類信息的方法,由子類實現(xiàn)。
       4      */
       5     void describe();
       6     /**
       7      * 聲明一個銷毀訂單的方法,由子類實現(xiàn)。
       8      */
       9     void destroyOrder();
      10 }




      實現(xiàn)類:ProductBean


       1 public class ProductBean implements IOperate {
       2     private OrdersBean ordersBean;
       3 
       4     /**
       5      * 初始化ProductBean類的實例
       6      */
       7     public ProductBean() {
       8         System.out.println(">>開始初始化ProductBean....");
       9         long startTime = System.currentTimeMillis();
      10         this.ordersBean = new OrdersBean();
      11         long endTime = System.currentTimeMillis();
      12         System.out.println(">>初始化ProductBean完成。耗時:" + (endTime - startTime) / 1000 + "秒");
      13     }
      14 
      15     public void describe() {
      16         System.out.println(">>describe描述:我是ProductBean類,執(zhí)行了describe()方法。");
      17     }
      18 
      19     public void destroyOrder() {
      20         System.out.println(">>開始執(zhí)行ProductBean.destroyOrder()方法...");
      21         if (this.ordersBean != null) {
      22             this.ordersBean.destroy();
      23             System.out.println(">>ProductBean.destroyOrder()方法執(zhí)行完成。");
      24         }
      25     }
      26 }



      實體類:OrderBean


       1 public class OrdersBean {
       2     public OrdersBean() {
       3         System.out.println(">>開始初始化OrderBean.....");
       4         InitOrder();
       5         System.out.println(">>初始化OrderBean完成。");
       6     }
       7 
       8     /**
       9      * 初始化訂單
      10      */
      11     private void InitOrder() {
      12         try {
      13             // 加載訂單數(shù)據(jù),這里模擬耗時3秒。
      14             Thread.sleep(5000);
      15         } catch (Exception e) {
      16             e.printStackTrace();
      17         }
      18     }
      19     
      20     public void destroy() {
      21         System.out.println(">> Order 已銷毀。");
      22     }
      23 }

      代理類:ProxyProductBean


       1 public class ProxyProductBean implements IOperate {
       2     private IOperate bean;
       3 
       4     public ProxyProductBean(IOperate bean) {
       5         System.out.println(">>開始初始化ProxyProductBean.....");
       6         long startTime = System.currentTimeMillis();
       7         this.bean = bean;
       8         long endTime = System.currentTimeMillis();
       9         System.out.println(">>初始化ProxyProductBean完成。耗時:" + (endTime - startTime) / 1000 + "秒");
      10     }
      11 
      12     public void describe() {
      13         System.out.println(">>describe描述:我是ProxyProductBean類,執(zhí)行了describe()方法。");
      14     }
      15 
      16     public void destroyOrder() {
      17         System.out.println(">>開始執(zhí)行ProxyProductBean.destroyOrder()方法...");
      18         if (bean == null) {
      19             bean = new ProductBean();
      20             bean.destroyOrder();
      21             System.out.println(">>執(zhí)行ProxyProductBean.destroyOrder()方法完成。");
      22         }
      23     }
      24 }

      測試類:


       1 public class Test {
       2     public static void main(String[] args) {
       3         System.out.println("==========不使用代理類調(diào)用describe()方法===============");
       4         ProductBean productBean = new ProductBean();
       5         productBean.describe();
       6         System.out.println("==========使用代理類調(diào)用describe()方法===============");
       7         IOperate description = (IOperate) (new ProxyProductBean(null));
       8         description.describe();
       9         System.out.println("==========不使用代理類調(diào)用cascadeOperate()方法===============");
      10         ProductBean productBean2 = new ProductBean();
      11         productBean2.destroyOrder();
      12         System.out.println("==========使用代理類調(diào)用cascadeOperate()方法===============");
      13         IOperate description2 = (IOperate) (new ProxyProductBean(null));
      14         description2.destroyOrder();
      15     }
      16 }

      測試結(jié)果輸出如下:
      ==========不使用代理類調(diào)用describe()方法===============
      >>開始初始化ProductBean....
      >>開始初始化OrderBean.....
      >>初始化OrderBean完成。
      >>初始化ProductBean完成。耗時:5秒
      >>describe描述:我是ProductBean類,執(zhí)行了describe()方法。
      ==========使用代理類調(diào)用describe()方法===============
      >>開始初始化ProxyProductBean.....
      >>初始化ProxyProductBean完成。耗時:0秒
      >>describe描述:我是ProxyProductBean類,執(zhí)行了describe()方法。
      ==========不使用代理類調(diào)用cascadeOperate()方法===============
      >>開始初始化ProductBean....
      >>開始初始化OrderBean.....
      >>初始化OrderBean完成。
      >>初始化ProductBean完成。耗時:5秒
      >>開始執(zhí)行ProductBean.destroyOrder()方法...
      >> Order 已銷毀。
      >>ProductBean.destroyOrder()方法執(zhí)行完成。
      ==========使用代理類調(diào)用cascadeOperate()方法===============
      >>開始初始化ProxyProductBean.....
      >>初始化ProxyProductBean完成。耗時:0秒
      >>開始執(zhí)行ProxyProductBean.destroyOrder()方法...
      >>開始初始化ProductBean....
      >>開始初始化OrderBean.....

        還原精靈
        (19)還原精靈
        還原精靈類的軟件一般常見于網(wǎng)吧,我們在網(wǎng)吧上網(wǎng)的時候不管使用一臺電腦下過什么或者刪除過什么,只要重啟之后機(jī)器都會恢復(fù)成原來的樣子,這種情況一般都是還原精靈的作用。相信有很多初學(xué)電腦的朋友都遇到過諸如系統(tǒng)崩潰、無法引導(dǎo)、病毒入侵和數(shù)據(jù)丟失等另他們頭痛不已的難題,而在解決這些問題后,我們往往會發(fā)現(xiàn)我們硬盤上的數(shù)據(jù)已經(jīng)被破壞或丟失了。正是因為這樣,學(xué)習(xí)如何保護(hù)好電腦中的數(shù)據(jù)的正確性與完整性就成了我們的首...更多>>
        一鍵還原
        (30)一鍵還原
        西西軟件園提供好用的一鍵還原工具合集下載,西西小編的電腦經(jīng)常1、2個星期就需要一鍵還原一次,所以一款好用的一鍵還原工具對西西小編來說很重要,西西小編使用的一鍵還原精靈,非常不錯哦,傻瓜式的系統(tǒng)備份還原免費工具,它具有安全、快速、保密性強(qiáng)、壓縮率高、兼容性好等特點,特別適合電腦新手和擔(dān)心操作麻煩的人使用。不修改硬盤分區(qū)表,安裝卸載倍加放心,自動選擇備份分區(qū),無需擔(dān)心空間是否夠用。完美支持多個分區(qū)備份還...更多>>
        備份還原
        (47)備份還原
        西西軟件園提供最好用的系統(tǒng)備份還原軟件,系統(tǒng)備份還原軟件功能強(qiáng)大,效率高:快速還原,昨日重現(xiàn),若感染病毒木馬或系統(tǒng)崩潰,快速恢復(fù)到健康狀態(tài);在Win32(64)、WinPE、DOS下對任意分區(qū)進(jìn)行一鍵備份、恢復(fù)的綠色無污程序,支持ISO文件、光盤、U盤里的GHO文件硬盤安裝。...更多>>
        • ghost3212.0.0.7031 綠色版

          11-15 / 1.5M

          推薦理由:不錯的工具,讓你感覺回到了DOS時代,大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個
        • 影子系統(tǒng)2011最新版

          02-14 / 2.1M

          推薦理由:影子系統(tǒng)Returnil System Safe Pro 2011Returnil System Safe Pro 2011是瑞泰尼爾公司采用最新虛擬技術(shù)實現(xiàn)
        • Gho文件瀏覽工具(Symantec Ghost E

          10-17 / 10.1M

          推薦理由:SymantecGhost是大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個磁盤上,也可以把磁盤
        • 大地一鍵還原備份工具V2版

          04-14 / 3.4M

          推薦理由:提供多種環(huán)境下的操作:win32、DOS,支持WINxp-Win7操作系統(tǒng)備份還原等功能,完美支持WIN7(隱藏分區(qū)等環(huán)境下
        • Ghost 8.3 和 Ghost11.5 合集綠色漢

          05-15 / 15.4M

          推薦理由:一、分區(qū)備份  使用Ghost進(jìn)行系統(tǒng)備份,有整個硬盤(Disk)和分區(qū)硬盤(Partition)兩種方式。在菜單中點
        • 雨林木風(fēng) OneKey GhostV13.5.23.20

          05-27 / 6.0M

          推薦理由:一、詳細(xì)說明: 1、默認(rèn)核心是 Ghost 11.5,可自定義 Ghost 版本 2、程序默認(rèn)對當(dāng)前系統(tǒng)所在分區(qū)進(jìn)行備份、
        聯(lián)想一鍵恢復(fù)
        (15)聯(lián)想一鍵恢復(fù)
        聯(lián)想一鍵恢復(fù)是專用于聯(lián)想電腦的一鍵恢復(fù)軟件,可以恢復(fù)為出廠系統(tǒng),可以做系統(tǒng)備份,有的版本可以進(jìn)行殺毒和隨機(jī)軟件安裝。聯(lián)想一鍵恢復(fù)詳細(xì)介紹:聯(lián)想一鍵恢復(fù)系統(tǒng)可用來備份系統(tǒng)分區(qū)(C分區(qū))的數(shù)據(jù)并在需要的時候使用此備份進(jìn)行系統(tǒng)恢復(fù)。在Windows操作系統(tǒng)下,可以創(chuàng)建整個系統(tǒng)分區(qū)的備份并將備份文件存儲在本地硬盤或者外部存儲設(shè)備上。除此之外,還可以創(chuàng)建恢復(fù)光盤,用于從光盤啟動和恢復(fù)系統(tǒng)。如果操作系統(tǒng)無法正常加載,...更多>>
        ghost
        (29)ghost
        西西軟件園提供最好用的一鍵GHOST工具,GHOST一鍵GHOS適應(yīng)各種用戶需要,既可獨立使用,又能相互配合.主要功能包括:一鍵備份C盤;一鍵恢復(fù)C盤;中文向?qū)?GHOST一鍵GHOST可輕易進(jìn)行系統(tǒng)還原,只需按一下"K"鍵,就能實現(xiàn)全自動無人值守操作,系統(tǒng)還原就這么簡單!...更多>>
        • ghost3212.0.0.7031 綠色版

          11-15 / 1.5M

          推薦理由:不錯的工具,讓你感覺回到了DOS時代,大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個
        • Gho文件瀏覽工具(Symantec Ghost E

          10-17 / 10.1M

          推薦理由:SymantecGhost是大名鼎鼎的硬盤備份工具,它可以把一個磁盤上的全部內(nèi)容復(fù)制到另外一個磁盤上,也可以把磁盤
        • Ghost 8.3 和 Ghost11.5 合集綠色漢

          05-15 / 15.4M

          推薦理由:一、分區(qū)備份  使用Ghost進(jìn)行系統(tǒng)備份,有整個硬盤(Disk)和分區(qū)硬盤(Partition)兩種方式。在菜單中點
        • Ghost安裝工具v12.0.0.805 簡體中

          09-08 / 14.8M

          推薦理由:適合電腦初學(xué)者的ghost安裝工具~本程序基于Ghost11內(nèi)核,可以直接用光碟上的系統(tǒng)還原;蛘邚木W(wǎng)上下載的gho
        • 雨林木風(fēng) OneKey GhostV13.5.23.20

          05-27 / 6.0M

          推薦理由:一、詳細(xì)說明: 1、默認(rèn)核心是 Ghost 11.5,可自定義 Ghost 版本 2、程序默認(rèn)對當(dāng)前系統(tǒng)所在分區(qū)進(jìn)行備份、
        • 一鍵ghost 硬盤版v2016.02.16 中文

          02-16 / 17.6M

          推薦理由:一鍵GHOST是"DOS之家"首創(chuàng)的4種版本(硬盤版/光盤版/優(yōu)盤版/軟盤版)同步發(fā)布的啟動盤,適應(yīng)各種用戶需要,既可

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)