亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2900 | 回復(fù): 0
打印 上一主題 下一主題

Proxy模式(轉(zhuǎn)載) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-01-08 08:21 |只看該作者 |倒序?yàn)g覽
為什么要使用Proxy?
1.授權(quán)機(jī)制 不同級別的用戶對同一對象擁有不同的訪問權(quán)利,如Jive 論壇系統(tǒng)中,就使用
Proxy 進(jìn)行授權(quán)機(jī)制控制,訪問論壇有兩種人:注冊用戶和游客(未注冊用戶),Jive 中就通過
類似ForumProxy 這樣的代理來控制這兩種用戶對論壇的訪問權(quán)限.
2.某個(gè)客戶端不能直接操作到某個(gè)對象,但又必須和那個(gè)對象有所互動(dòng).
舉例兩個(gè)具體情況:
(1)如果那個(gè)對象是一個(gè)是很大的圖片,需要花費(fèi)很長時(shí)間才能顯示出來,那么當(dāng)這個(gè)圖片包
含在文檔中時(shí),使用編輯器或?yàn)g覽器打開這個(gè)文檔,打開文檔必須很迅速,不能等待大圖片處
理完成,這時(shí)需要做個(gè)圖片Proxy 來代替真正的圖片.
(2)如果那個(gè)對象在Internet 的某個(gè)遠(yuǎn)端服務(wù)器上,直接操作這個(gè)對象因?yàn)榫W(wǎng)絡(luò)速度原因可
能比較慢,那我們可以先用Proxy 來代替那個(gè)對象.
總之原則是,對于開銷很大的對象,只有在使用它時(shí)才創(chuàng)建,這個(gè)原則可以為我們節(jié)省很多寶
貴的Java 內(nèi)存. 所以,有些人認(rèn)為Java 耗費(fèi)資源內(nèi)存,我以為這和程序編制思路也有一定的
關(guān)系.

如何使用Proxy?
以Jive 論壇系統(tǒng)為例,訪問論壇系統(tǒng)的用戶有多種類型:注冊普通用戶 論壇管理者 系統(tǒng)管
理者 游客,注冊普通用戶才能發(fā)言;論壇管理者可以管理他被授權(quán)的論壇;系統(tǒng)管理者可以
管理所有事務(wù)等,這些權(quán)限劃分和管理是使用Proxy 完成的.
Forum 是Jive 的核心接口,在Forum 中陳列了有關(guān)論壇操作的主要行為,如論壇名稱 論壇描
述的獲取和修改,帖子發(fā)表刪除編輯等.
在ForumPermissions 中定義了各種級別權(quán)限的用戶:
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 中各種操作權(quán)限是和ForumPermissions 定義的用戶級別有關(guān)系的,作為接口
Forum 的實(shí)現(xiàn):ForumProxy 正是將這種對應(yīng)關(guān)系聯(lián)系起來.比如,修改Forum 的名稱,只有論壇
管理者或系統(tǒng)管理者可以修改,代碼如下:
  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
     {
        //只有是系統(tǒng)或論壇管理者才可以修改名稱
        if (permissions.isSystemOrForumAdmin()) {
           forum.setName(name);
        }
        else {
           throw new UnauthorizedException();
        }
     }
     ...
  }

而DbForum 才是接口Forum 的真正實(shí)現(xiàn),以修改論壇名稱為例:
  public class DbForum implements Forum, Cacheable {
     ...
     public void setName(String name) throws
     ForumAlreadyExistsException {
        ....
        this.name = name;
        //這里真正將新名稱保存到數(shù)據(jù)庫中
        saveToDb();
        ....
     }
     ...
  }

凡是涉及到對論壇名稱修改這一事件,其他程序都首先得和ForumProxy 打交道,由
ForumProxy 決定是否有權(quán)限做某一樣事情,ForumProxy 是個(gè)名副其實(shí)的"網(wǎng)關(guān)","安全代理
系統(tǒng)".

我們已經(jīng)知道,使用Forum 需要通過ForumProxy,Jive 中創(chuàng)建一個(gè)Forum 是使用Factory 模
式,有一個(gè)總的抽象類ForumFactory,在這個(gè)抽象類中,調(diào)用ForumFactory 是通過
getInstance()方法實(shí)現(xiàn),這里使用了Singleton,getInstance()返回的是ForumFactoryProxy.
為什么不返回ForumFactory,而返回ForumFactory 的實(shí)現(xiàn)ForumFactoryProxy?
原因是明顯的,需要通過代理確定是否有權(quán)限創(chuàng)建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
     {
        //只有系統(tǒng)管理者才可以創(chuàng)建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 交互
操作.
注意到這里有兩個(gè)Proxy:ForumProxy 和ForumFactoryProxy. 代表兩個(gè)不同的職責(zé):使用
Forum 和創(chuàng)建Forum;
至于為什么將使用對象和創(chuàng)建對象分開,這也是為什么使用Factory 模式的原因所在:是為
了"封裝" "分派";換句話說,盡可能功能單一化,方便維護(hù)修改.

以上我們討論了如何使用Proxy 進(jìn)行授權(quán)機(jī)制的訪問,Proxy 還可以對用戶隱藏另外一種稱
為copy-on-write 的優(yōu)化方式.拷貝一個(gè)龐大而復(fù)雜的對象是一個(gè)開銷很大的操作,如果拷
貝過程中,沒有對原來的對象有所修改,那么這樣的拷貝開銷就沒有必要.用代理延遲這一拷
貝過程.

比如:我們有一個(gè)很大的Collection,具體如hashtable,有很多客戶端會并發(fā)同時(shí)訪問它.
其中一個(gè)特別的客戶端要進(jìn)行連續(xù)的數(shù)據(jù)獲取,此時(shí)要求其他客戶端不能再向hashtable 中
增加或刪除 東東.
最直接的解決方案是:使用collection 的lock,讓這特別的客戶端獲得這個(gè)lock,進(jìn)行連續(xù)
的數(shù)據(jù)獲取,然后再釋放lock.
   public void foFetches(Hashtable ht){
      synchronized(ht){
         //具體的連續(xù)數(shù)據(jù)獲取動(dòng)作..
      }
   }
但是這一辦法可能鎖住Collection 會很長時(shí)間,這段時(shí)間,其他客戶端就不能訪問該Collection 了.
第二個(gè)解決方案是clone 這個(gè)Collection,然后讓連續(xù)的數(shù)據(jù)獲取針對clone 出來的那個(gè)
Collection 操作.這個(gè)方案前提是,這個(gè)Collection 是可clone 的,而且必須有提供深度
clone 的方法.Hashtable 就提供了對自己的clone 方法,但不是Key 和value 對象的clone,
關(guān)于Clone 含義可以參考專門文章.
   public void foFetches(Hashtable ht){
     Hashttable newht=(Hashtable)ht.clone();
   }
問題又來了,由于是針對clone 出來的對象操作,如果原來的母體被其他客戶端操作修改了,
那么對clone 出來的對象操作就沒有意義了.
最后解決方案:我們可以等其他客戶端修改完成后再進(jìn)行clone,也就是說,這個(gè)特別的客戶
端先通過調(diào)用一個(gè)叫clone 的方法來進(jìn)行一系列數(shù)據(jù)獲取操作.但實(shí)際上沒有真正的進(jìn)行對
象拷貝,直至有其他客戶端修改了這個(gè)對象Collection.
使用Proxy 實(shí)現(xiàn)這個(gè)方案.這就是copy-on-write 操作.

本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u2/67175/showart_2143547.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP