設(shè)計(jì)模式之代理模式(轉(zhuǎn))

           

          原帖地址 : http://blog.csdn.net/wdwgr/archive/2009/04/09/4060739.aspx

           

          一. 代理模式:

          代理模式就是給某一個(gè)對象提供一個(gè)代理對象,并由代理對象控制對源對象的引用。就是一個(gè)人或者一個(gè)機(jī)構(gòu)代替另一個(gè)人或者另一個(gè)機(jī)構(gòu)去采取一些行動(dòng)。

           

          二. 代理模式所涉及到的角色:

          抽象角色:提供一種真實(shí)角色和代理角色所共有的接口

          真實(shí)角色:定義了代理角色要代理的真實(shí)對象

          代理角色:含有對真實(shí)角色的引用,通常在客戶端調(diào)用時(shí)代理對象都要在真實(shí)角色對象的基礎(chǔ)上增加一些真實(shí)角色所不能勝任的工作,而不只是簡單的含有真實(shí)角色的引用

           

          三. 舉例:

          跟MM在網(wǎng)上聊天,一開頭通常總是“hi”,“你好”, “你從哪里來?”, “你多大了”,等等這些話,真煩人,寫個(gè)程序?yàn)槲易龃戆桑彩鞘盏竭@些消息,都設(shè)置好了自動(dòng)回復(fù)功能,接收到其他有價(jià)值的消息時(shí)在通知我回答,怎么樣,很酷吧,這都要?dú)w功于這個(gè)代理類。

           

          代碼:

           

             1. /**
             2.  * 抽象角色,提供代理類和具體類的公共接口
             3.  * @author Administrator
             4.  *
             5.  */ 
             6. public interface Chat { 
             7.  
             8.     public void reply(String message); 
             9. } 
            10. /**
            11.  * 具體角色類,被代理的類
            12.  * @author Administrator
            13.  *
            14.  */ 
            15. public class MyChat implements Chat{ 
            16.  
            17.     public void reply(String message) { 
            18.      
            19.         System.out.println("需要我親自回復(fù)的內(nèi)容。。。"); 
            20.     } 
            21. } 
            22. /**
            23.  * 代理類,持有被代理類的一個(gè)引用
            24.  * @author Administrator
            25.  *
            26.  */ 
            27. public class ChatProxy implements Chat{ 
            28.  
            29.     private MyChat mc = new MyChat(); 
            30.      
            31.     public void reply(String message) { 
            32.      
            33.         if(message.equals("hi,你好")) { 
            34.             System.out.println("hi, 你也好"); 
            35.         }else if(message.equals("你從哪里來?")){ 
            36.             System.out.println("我來自中國。。。"); 
            37.         }else if(message.equals("你多大了?")) { 
            38.             System.out.println("我今年22了。。。"); 
            39.         } 
            40.         else { 
            41.             mc.reply(message); 
            42.         } 
            43.     } 
            44. } 

           客戶端直接對代理類進(jìn)行調(diào)用:

             1. public class ProxyTest { 
             2.  
             3.     public static void main(String[] args) { 
             4.         //直接調(diào)用代理類 
             5.         ChatProxy cp = new ChatProxy(); 
             6.          
             7.                 //代理類提供的實(shí)現(xiàn) 
             8.         cp.reply("hi,你好"); 
             9.                 //具體類提供的實(shí)現(xiàn) 
            10.         cp.reply("你喜歡我嗎?"); 
            11.     } 
            12. } 

          四. 總結(jié):

          在某些情況下,客戶不想或者不能直接引用一個(gè)對象,這個(gè)時(shí)候就用到了代理類,代理對象可以再客戶和目標(biāo)對象之間起到中介的作用,客戶端分辨不出代理對象與真實(shí)對象的區(qū)別,代理模式可以不知道真正的代理對象,而僅僅持有一個(gè)被代理對象的接口,這時(shí)候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。

          繼續(xù)努力,加油!

          posted on 2009-10-22 15:30 AK47 閱讀(155) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2009年10月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 沅陵县| 武乡县| 蒲城县| 抚州市| 南宁市| 寿宁县| 广南县| 阳山县| 牡丹江市| 易门县| 海兴县| 雷波县| 澄城县| 河池市| 黄陵县| 揭阳市| 陆川县| 班戈县| 合水县| 且末县| 陇南市| 阿克陶县| 澄江县| 浏阳市| 界首市| 岳普湖县| 平谷区| 兴仁县| 镇江市| 桓仁| 长沙市| 博湖县| 鞍山市| 平邑县| 隆德县| 通河县| 九寨沟县| 宜君县| 潼关县| 彭阳县| 额敏县|