亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java設計模式之代理模式(Proxy模式)介紹

2019-11-26 15:16:47
字體:
來源:轉載
供稿:網友

理解并使用設計模式,能夠培養我們良好的面向對象編程習慣,同時在實際應用中,可以如魚得水,享受游刃有余的樂趣。

Proxy是比較有用途的一種模式,而且變種較多,應用場合覆蓋從小結構到整個系統的大結構,Proxy是代理的意思,我們也許有代理服務器等概念,代理概念可以解釋為:在出發點到目的地之間有一道中間層,意為代理。

設計模式中定義:為其他對象提供一種代理以控制對這個對象的訪問。

為什么要使用代理模式

1.授權機制 不同級別的用戶對同一對象擁有不同的訪問權利,如Jive論壇系統中,就使用Proxy進行授權機制控制,訪問論壇有兩種人:注冊用戶和游客(未注冊用戶),Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權限。
2.某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動。

舉例兩個具體情況:

1.如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那么當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片。
2.如果那個對象在Internet的某個遠端服務器上,直接操作這個對象因為網絡速度原因可能比較慢,那我們可以先用Proxy來代替那個對象。

總之原則是,對于開銷很大的對象,只有在使用它時才創建,這個原則可以為我們節省很多寶貴的Java內存。所以,有些人認為Java耗費資源內存,我以為這和程序編制思路也有一定的關系。

如何使用代理模式

以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談入深一點,下面要涉及到工廠模式了。

我們已經知道,使用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。

復制代碼 代碼如下:

public void foFetches(Hashtable ht){
 Hashttable newht=(Hashtable)ht.clone();
}

問題又來了,由于是針對clone出來的對象操作,如果原來的母體被其他客戶端操作修改了,那么對clone出來的對象操作就沒有意義了。

最后解決方案:我們可以等其他客戶端修改完成后再進行clone,也就是說,這個特別的客戶端先通過調用一個叫clone的方法來進行一系列數據獲取操作。但實際上沒有真正的進行對象拷貝,直至有其他客戶端修改了這個對象Collection。

使用Proxy實現這個方案,這就是copy-on-write操作。

Proxy應用范圍很廣,現在流行的分布計算方式RMI和Corba等都是Proxy模式的應用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线狂野欧美精品| 亚洲性生活视频| 欧美极品美女视频网站在线观看免费| 国产日韩精品在线播放| 亚洲国产精品va在线观看黑人| 欧美日韩999| 亚洲性xxxx| 性色av一区二区三区免费| 久久综合伊人77777| 日本一区二区在线免费播放| 欧美激情免费观看| 日韩女优人人人人射在线视频| 亚洲免费av电影| 日韩在线中文视频| 欧美大成色www永久网站婷| 夜夜躁日日躁狠狠久久88av| 亚洲专区在线视频| 亚洲日韩欧美视频| 欧美一级片一区| 91香蕉国产在线观看| 欧美日韩亚洲一区二| 超薄丝袜一区二区| 久久亚洲欧美日韩精品专区| 国产免费一区二区三区在线能观看| 国产精品美女久久久久久免费| 国产亚洲精品va在线观看| 国产精品成人观看视频国产奇米| 久久精品国亚洲| 亚洲www视频| 久久免费国产精品1| 亚洲美女视频网| 中文字幕日韩欧美| 在线激情影院一区| 国产亚洲日本欧美韩国| 国产欧美在线视频| 久久黄色av网站| 国产999精品久久久影片官网| 国产精品香蕉国产| 久久精品国产精品亚洲| 欧美成人国产va精品日本一级| 亚洲成人精品久久久| 欧美高清在线视频观看不卡| 亚洲免费中文字幕| 韩国v欧美v日本v亚洲| 欧美激情精品久久久久| 亚洲欧美另类自拍| 奇米一区二区三区四区久久| 亚洲第一福利在线观看| www.久久草.com| 久久91亚洲人成电影网站| 成人黄色片网站| 亚洲丝袜av一区| 国内精品伊人久久| 成人黄色在线播放| 日韩欧美高清在线视频| 欧美大片欧美激情性色a∨久久| 成人在线免费观看视视频| 久久久国产精品视频| 高清亚洲成在人网站天堂| 亚洲欧美日本精品| 成人疯狂猛交xxx| 亚洲第一中文字幕在线观看| 欧美俄罗斯乱妇| 亚洲一区二区久久久| 欧美大片在线看| 欧美日韩精品在线观看| 欧美日韩在线视频一区二区| 国产精品永久在线| 亚洲第一偷拍网| 色与欲影视天天看综合网| 亚洲美女福利视频网站| 尤物yw午夜国产精品视频明星| 精品国产欧美一区二区三区成人| 色婷婷成人综合| 亚洲成人精品视频| 欧美交受高潮1| 国产成人亚洲综合91精品| 日韩av手机在线观看| 久久久久久久久综合| 日韩最新中文字幕电影免费看| 国产美女久久精品| 欧洲中文字幕国产精品| 最近中文字幕2019免费| 亚洲美腿欧美激情另类| 国产97在线|日韩| 欧美一区二区大胆人体摄影专业网站| 亚洲老板91色精品久久| 伊人久久久久久久久久久| 亚洲国产精彩中文乱码av在线播放| 中文字幕欧美日韩va免费视频| 精品在线欧美视频| 奇米四色中文综合久久| 97精品国产97久久久久久| 国产欧美日韩视频| 国产精品嫩草视频| 国产成人在线播放| 国内揄拍国内精品| 午夜精品久久久久久久白皮肤| 日韩在线观看电影| 精品中文字幕在线| 欧美性高跟鞋xxxxhd| 欧美极品美女视频网站在线观看免费| 久久天天躁夜夜躁狠狠躁2022| 色综合伊人色综合网| 久久国产精品久久久久| 国产综合在线观看视频| 欧美激情第99页| 51久久精品夜色国产麻豆| 俺去了亚洲欧美日韩| 亚洲精品一区二区久| 日韩av影视在线| 欧美日韩福利在线观看| 亚洲xxxx做受欧美| 国产成人拍精品视频午夜网站| 日韩高清av一区二区三区| 久久久精品影院| 26uuu日韩精品一区二区| 成人午夜在线影院| 国产91网红主播在线观看| 成人欧美在线观看| 成人在线观看视频网站| 精品一区二区三区四区| 黄色91在线观看| 久久九九国产精品怡红院| 国产人妖伪娘一区91| 九九热精品视频国产| 国产成人在线一区二区| 亚洲淫片在线视频| 欧美影院成年免费版| 米奇精品一区二区三区在线观看| 国模吧一区二区| 亚洲大胆人体av| 97久久久免费福利网址| 亚洲国产成人精品女人久久久| 91九色国产社区在线观看| 国产精品女主播| 韩日欧美一区二区| 26uuu亚洲伊人春色| 欧美一级高清免费| 黄色成人在线免费| 日韩精品在线观看一区二区| 久久琪琪电影院| 永久免费精品影视网站| 成人在线观看视频网站| 久久精品国产一区二区电影| 欧美洲成人男女午夜视频| 欧美日韩国产综合新一区| 影音先锋欧美在线资源| 亚洲成人黄色网址| 午夜精品在线视频| 亚洲成人久久电影| 影音先锋欧美在线资源| 97人人模人人爽人人喊中文字| 色综合视频一区中文字幕| 久久久久久69| 91精品国产高清久久久久久91| 九九九久久国产免费| 国产精品爱啪在线线免费观看| 亚洲肉体裸体xxxx137| 国产成人精品久久二区二区| 俺去啦;欧美日韩| 欧美成人午夜激情在线| www国产91| 国产成人jvid在线播放|