亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

java設計模式之Proxy(代理)

瀏覽:5日期:2024-06-30 13:17:18
內容: 理解并使用設計模式,能夠培養我們良好的面向對象編程習慣,同時在實際應用中,可以如魚得水,享受游刃有余的樂趣.Proxy是比較有用途的一種模式,而且變種較多,應用場合覆蓋從小結構到整個系統的大結構,Proxy是代理的意思,我們也許有代理服務器等概念,代理概念可以解釋為:在出發點到目的地之間有一道中間層,意為代理.設計模式中定義: 為其他對象提供一種代理以控制對這個對象的訪問.為什么要使用Proxy?1.授權機制 不同級別的用戶對同一對象擁有不同的訪問權利,如Jive論壇系統中,就使用Proxy進行授權機制控制,訪問論壇有兩種人:注冊用戶和游客(未注冊用戶),Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權限.2.某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動.舉例兩個具體情況: (1)如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那么當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片.(2)如果那個對象在Internet的某個遠端服務器上,直接操作這個對象因為網絡速度原因可能比較慢,那我們可以先用Proxy來代替那個對象.總之原則是,對于開銷很大的對象,只有在使用它時才創建,這個原則可以為我們節省很多寶貴的Java內存. 所以,有些人認為Java耗費資源內存,我以為這和程序編制思路也有一定的關系.如何使用Proxy?以Jive論壇系統為例,訪問論壇系統的用戶有多種類型:注冊普通用戶 論壇管理者 系統管理者 游客,注冊普通用戶才能發言;論壇管理者可以管理他被授權的論壇;系統管理者可以管理所有事務等,這些權限劃分和管理是使用Proxy完成的.Forum是Jive的核心接口,在Forum中陳列了有關論壇操作的主要行為,如論壇名稱 論壇描述的獲取和修改,帖子發表刪除編輯等.在ForumPermissions中定義了各種級別權限的用戶:public class ForumPermissions implements Cacheable { /*** Permission to read object.*/public static final int READ = 0;/*** Permission to administer the entire sytem.*/public static final int SYSTEM_ADMIN = 1;/*** Permission to administer a particular forum.*/public static final int FORUM_ADMIN = 2;/*** Permission to administer a particular user.*/public static final int USER_ADMIN = 3;/*** Permission to administer a particular group.*/public static final int GROUP_ADMIN = 4;/*** Permission to moderate threads.*/public static final int MODERATE_THREADS = 5;/*** Permission to create a new thread.*/public static final int CREATE_THREAD = 6;/*** Permission to create a new message.*/public static final int CREATE_MESSAGE = 7;/*** Permission to moderate messages.*/public static final int MODERATE_MESSAGES = 8;.....public boolean isSystemOrForumAdmin() {return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);}.....} 因此,Forum中各種操作權限是和ForumPermissions定義的用戶級別有關系的,作為接口Forum的實現:ForumProxy正是將這種對應關系聯系起來.比如,修改Forum的名稱,只有論壇管理者或系統管理者可以修改,代碼如下:public class ForumProxy implements Forum {private ForumPermissions permissions;private Forum forum; this.authorization = authorization; public ForumProxy(Forum forum, Authorization authorization,ForumPermissions permissions){this.forum = forum;this.authorization = authorization;this.permissions = permissions;}.....public void setName(String name) throws UnauthorizedException,ForumAlreadyExistsException{//只有是系統或論壇管理者才可以修改名稱if (permissions.isSystemOrForumAdmin()) {forum.setName(name);}else {throw new UnauthorizedException();}}...} 而DbForum才是接口Forum的真正實現,以修改論壇名稱為例:public class DbForum implements Forum, Cacheable {...public void setName(String name) throws ForumAlreadyExistsException {....this.name = name;//這里真正將新名稱保存到數據庫中 saveToDb();....}... } 凡是涉及到對論壇名稱修改這一事件,其他程序都首先得和ForumProxy打交道,由ForumProxy決定是否有權限做某一樣事情,ForumProxy是個名副其實的'網關','安全代理系統'.在平時應用中,無可避免總要涉及到系統的授權或安全體系,不管你有無意識的使用Proxy,實際你已經在使用Proxy了.我們繼續結合Jive談入深一點,下面要涉及到工廠模式了,如果你不了解工廠模式,請看我的另外一篇文章:設計模式之Factory我們已經知道,使用Forum需要通過ForumProxy,Jive中創建一個Forum是使用Factory模式,有一個總的抽象類ForumFactory,在這個抽象類中,調用ForumFactory是通過getInstance()方法實現,這里使用了Singleton(也是設計模式之一,由于介紹文章很多,我就不寫了,看這里),getInstance()返回的是ForumFactoryProxy.為什么不返回ForumFactory,而返回ForumFactory的實現ForumFactoryProxy?原因是明顯的,需要通過代理確定是否有權限創建forum.在ForumFactoryProxy中我們看到代碼如下:public class ForumFactoryProxy extends ForumFactory { protected ForumFactory factory;protected Authorization authorization;protected ForumPermissions permissions;public ForumFactoryProxy(Authorization authorization, ForumFactory factory,ForumPermissions permissions){this.factory = factory;this.authorization = authorization;this.permissions = permissions;}public Forum createForum(String name, String description)throws UnauthorizedException, ForumAlreadyExistsException{//只有系統管理者才可以創建forum if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {Forum newForum = factory.createForum(name, description);return new ForumProxy(newForum, authorization, permissions);}else {throw new UnauthorizedException();}} 方法createForum返回的也是ForumProxy, Proxy就象一道墻,其他程序只能和Proxy交互操作.注意到這里有兩個Proxy:ForumProxy和ForumFactoryProxy. 代表兩個不同的職責:使用Forum和創建Forum;至于為什么將使用對象和創建對象分開,這也是為什么使用Factory模式的原因所在:是為了'封裝' '分派';換句話說,盡可能功能單一化,方便維護修改.Jive論壇系統中其他如帖子的創建和使用,都是按照Forum這個思路而來的.以上我們討論了如何使用Proxy進行授權機制的訪問,Proxy還可以對用戶隱藏另外一種稱為copy-on-write的優化方式.拷貝一個龐大而復雜的對象是一個開銷很大的操作,如果拷貝過程中,沒有對原來的對象有所修改,那么這樣的拷貝開銷就沒有必要.用代理延遲這一拷貝過程.比如:我們有一個很大的Collection,具體如hashtable,有很多客戶端會并發同時訪問它.其中一個特別的客戶端要進行連續的數據獲取,此時要求其他客戶端不能再向hashtable中增加或刪除 東東.最直接的解決方案是:使用collection的lock,讓這特別的客戶端獲得這個lock,進行連續的數據獲取,然后再釋放lock.public void foFetches(Hashtable ht){synchronized(ht){//具體的連續數據獲取動作.. } }但是這一辦法可能鎖住Collection會很長時間,這段時間,其他客戶端就不能訪問該Collection了.第二個解決方案是clone這個Collection,然后讓連續的數據獲取針對clone出來的那個Collection操作.這個方案前提是,這個Collection是可clone的,而且必須有提供深度clone的方法.Hashtable就提供了對自己的clone方法,但不是Key和value對象的clone,關于Clone含義可以參考專門文章.public void foFetches(Hashtable ht){Hashttable newht=(Hashtable)ht.clone();}問題又來了,由于是針對clone出來的對象操作,如果原來的母體被其他客戶端操作修改了, 那么對clone出來的對象操作就沒有意義了.最后解決方案:我們可以等其他客戶端修改完成后再進行clone,也就是說,這個特別的客戶端先通過調用一個叫clone的方法來進行一系列數據獲取操作.但實際上沒有真正的進行對象拷貝,直至有其他客戶端修改了這個對象Collection.使用Proxy實現這個方案.這就是copy-on-write操作.Proxy應用范圍很廣,現在流行的分布計算方式RMI和Corba等都是Proxy模式的應用.更多Proxy應用,見http://www.research.umbc.edu/~tarr/cs491/lectures/Proxy.pdfSun公司的 Explore the Dynamic Proxy API Dynamic Proxy Classes Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標簽: Java
相關文章:
主站蜘蛛池模板: 欧美色图综合网 | 国产一区二区三区美女在线观看 | 国产免费全部免费观看 | 亚洲国产成人在线 | 天天拍拍天天爽免费视频 | 毛茸茸年轻成熟亚洲人 | 国产视频999 | 亚洲国产欧美日韩精品一区二区三区 | 免费国产黄网站在线观看视频 | 欧美a级黄色大片 | 小泽玛利亚一区二区 | 亚洲欧美手机在线观看 | 老年人一级特黄aa大片 | 精品一区二区三区在线播放 | 亚洲国产片高清在线观看 | 天天拍夜夜添久久精品中文 | 国产精品亚洲精品爽爽 | 色综合久久久久久久久五月性色 | 黄色网页在线免费观看 | 日韩在线免费视频观看 | 欧美特黄一区二区三区 | 免费黄色三级 | 日韩精品一区二区三区四区 | 国产免费无遮挡精品视频 | 国产精品夜色视频一区二区 | 国产精品久久久久久久久久久威 | 性感美女在线喷水 | 亚洲欧美中文在线观看4 | 99久久免费看精品国产一区 | 免费一级真人毛片 | 特黄一级毛片 | 国产毛片高清 | 美国一级大黄大色毛片视频一 | 国产精品视频人人做人人爱 | 欧美精品国产一区二区三区 | 男人都懂的www网站免费观看 | 九九热香蕉视频 | 日本无卡无吗中文免费 | 久久精品国产主播一区二区 | 91精品国产91久久久久久最新 | 国产精品一区高清在线观看 |