最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java設(shè)計(jì)模式之代理模式

 更新時(shí)間:2021年11月08日 09:24:27   作者:一指流砂~  
這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下

一、引言

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

但是在程序員編寫程序的時(shí)候,會(huì)經(jīng)常使用connection.close()這樣的方法,去關(guān)閉數(shù)據(jù)庫連接,而且這樣做是對(duì)的,所以你并不能告訴程序員們說,你們使用連接都不要關(guān)了,去調(diào)用一個(gè)其他的類似歸還給連接池的方法吧。這是不符合程序員的編程思維的,也很勉強(qiáng),而且具有風(fēng)險(xiǎn)性,因?yàn)槌绦騿T會(huì)忘的。

解決這一問題的辦法就是使用代理模式,因?yàn)榇砟J娇梢蕴娲蓄惖男袨?,所以我們要做的就是替換掉connection的close行為。

二、什么是代理模式

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

三、代理模式的結(jié)構(gòu)

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

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

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

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

代理模式和裝飾模式的代碼實(shí)現(xiàn)方式很相同,主要不同點(diǎn)是代理模式關(guān)注與被代理對(duì)象行為的控制,然而裝飾模式關(guān)注于在一個(gè)對(duì)象上動(dòng)態(tài)的添加方法。

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

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

五、代理模式和委托

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

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

六、代理模式的種類

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

(1) 遠(yuǎn)程代理(Remote Proxy):為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)本地的代理對(duì)象,這個(gè)不同的地址空間可以是在同一臺(tái)主機(jī)中,也可是在另一臺(tái)主機(jī)中,遠(yuǎn)程代理又稱為大使(Ambassador)。

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

(3) 保護(hù)代理(Protect Proxy):控制對(duì)一個(gè)對(duì)象的訪問,可以給不同的用戶提供不同級(jí)別的使用權(quán)限。

(4) 緩沖代理(Cache Proxy):為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,以便多個(gè)客戶端可以共享這些結(jié)果。

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

七、代理模式的應(yīng)用場(chǎng)景

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

(1) 當(dāng)客戶端對(duì)象需要訪問遠(yuǎn)程主機(jī)中的對(duì)象時(shí)可以使用遠(yuǎn)程代理。

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

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

(4) 當(dāng)需要控制對(duì)一個(gè)對(duì)象的訪問,為不同用戶提供不同級(jí)別的訪問權(quán)限時(shí)可以使用保護(hù)代理。

(5) 當(dāng)需要為一個(gè)對(duì)象的訪問(引用)提供一些額外的操作時(shí)可以使用智能引用代理。

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

優(yōu)點(diǎn):

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

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

缺點(diǎn):

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

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

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

class SchoolGirl            //定義 女孩類
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
//抽象主題類聲明了真實(shí)主題類和代理類的公共方法,它可以是接口、抽象類或具體類,客戶端針對(duì)抽象主題類編程,一致性地對(duì)待真實(shí)主題和代理主題,interface IGiveGift        //創(chuàng)建一個(gè)送禮物的接口
    {
        void GiveDolls();
        void GiveFlowers();
        void GiveChocolate();
    }
//真實(shí)主題類繼承了抽象主題類,提供了業(yè)務(wù)方法的具體實(shí)現(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 + "送你巧克力");
        }
    }
//代理類也是抽象主題類的子類,它維持一個(gè)對(duì)真實(shí)主題對(duì)象的引用,調(diào)用在真實(shí)主題中實(shí)現(xiàn)的業(yè)務(wù)方法,在調(diào)用時(shí)可以在原有業(yè)務(wù)方法的基礎(chǔ)上附加一些新的方法來對(duì)功能進(jìn)行擴(kuò)充或約束,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();
        }
    }

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Intellij IDEA解析jacoco結(jié)果文件的方法

    Intellij IDEA解析jacoco結(jié)果文件的方法

    這篇文章主要介紹了Intellij IDEA解析jacoco結(jié)果文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java8 stream的多字段排序?qū)崿F(xiàn)(踩坑)

    java8 stream的多字段排序?qū)崿F(xiàn)(踩坑)

    這篇文章主要介紹了java8 stream的多字段排序?qū)崿F(xiàn)(踩坑),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java?Swing實(shí)現(xiàn)掃雷源碼

    Java?Swing實(shí)現(xiàn)掃雷源碼

    這篇文章主要為大家詳細(xì)介紹了Java?Swing實(shí)現(xiàn)掃雷源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 用Java設(shè)計(jì)實(shí)現(xiàn)多實(shí)例多庫查詢方式

    用Java設(shè)計(jì)實(shí)現(xiàn)多實(shí)例多庫查詢方式

    這篇文章主要介紹了用Java設(shè)計(jì)實(shí)現(xiàn)多實(shí)例多庫查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot集成nacos報(bào)錯(cuò):get data from Nacos error,dataId:null.yaml的原因及解決方法

    springboot集成nacos報(bào)錯(cuò):get data from Nacos 

    這篇文章給大家介紹了springboot集成nacos報(bào)錯(cuò):get data from Nacos error,dataId:null.yaml的原因及解決方法,如果又遇到相同問題的朋友可以參考閱讀本文
    2023-10-10
  • Java使用同步方法解決銀行取錢的安全問題案例分析

    Java使用同步方法解決銀行取錢的安全問題案例分析

    這篇文章主要介紹了Java使用同步方法解決銀行取錢的安全問題,結(jié)合具體案例形式分析了java同步方法實(shí)現(xiàn)多線程安全操作銀行取錢問題,需要的朋友可以參考下
    2019-09-09
  • Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法

    Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法

    這篇文章主要介紹了Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Java中死鎖的原理實(shí)戰(zhàn)分析

    Java中死鎖的原理實(shí)戰(zhàn)分析

    這篇文章主要介紹了Java中死鎖的原理,結(jié)合具體案例形式分析了java死鎖形成的相關(guān)原理,需要的朋友可以參考下
    2019-08-08
  • Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例

    Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例

    這篇文章主要介紹了Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • spring中@RestController和@Controller的區(qū)別小結(jié)

    spring中@RestController和@Controller的區(qū)別小結(jié)

    @RestController和@Controller這兩個(gè)注解用于創(chuàng)建Web應(yīng)用程序的控制器類,那么這兩個(gè)注解有哪些區(qū)別,本文就來介紹一下,并用示例代碼說明,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

晴隆县| 宁强县| 福泉市| 鄂伦春自治旗| 张家口市| 穆棱市| 阿城市| 玉田县| 浙江省| 新兴县| 黄梅县| 藁城市| 黄龙县| 唐河县| 永年县| 阜宁县| 长武县| 西乌珠穆沁旗| 洞头县| 广南县| 呼伦贝尔市| 涡阳县| 邯郸市| 达尔| 富阳市| 怀宁县| 抚州市| 寻乌县| 无棣县| 竹山县| 时尚| 铁力市| 班玛县| 布尔津县| 通许县| 卢湾区| 两当县| 嘉鱼县| 库尔勒市| 佳木斯市| 中江县|