程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之署理形式(Proxy形式)引見

Java設計形式之署理形式(Proxy形式)引見

編輯:關於JAVA

Java設計形式之署理形式(Proxy形式)引見。本站提示廣大學習愛好者:(Java設計形式之署理形式(Proxy形式)引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之署理形式(Proxy形式)引見正文


懂得並應用設計形式,可以或許造就我們優越的面向對象編程習氣,同時在現實運用中,可以甕中之鱉,享用熟能生巧的樂趣。

Proxy是比擬有效途的一種形式,並且變種較多,運用場所籠罩從小構造到全部體系的年夜構造,Proxy是署理的意思,我們或許有署理辦事器等概念,署理概念可以說明為:在動身點到目標地之間有一道中央層,意為署理。

設計形式中界說:為其他對象供給一種署理以掌握對這個對象的拜訪。

為何要應用署理形式

1.受權機制 分歧級其余用戶對統一對象具有分歧的拜訪權力,如Jive服裝論壇t.vhao.net體系中,就應用Proxy停止受權機制掌握,拜訪服裝論壇t.vhao.net有兩種人:注冊用戶和旅客(未注冊用戶),Jive中就經由過程相似ForumProxy如許的署理來掌握這兩種用戶對服裝論壇t.vhao.net的拜訪權限。
2.某個客戶端不克不及直接操作到某個對象,但又必需和誰人對象有所互動。

舉例兩個詳細情形:

1.假如誰人對象是一個是很年夜的圖片,須要消費很長時光能力顯示出來,那末當這個圖片包括在文檔中時,應用編纂器或閱讀器翻開這個文檔,翻開文檔必需很敏捷,不克不及期待年夜圖片處置完成,這時候須要做個圖片Proxy來取代真實的圖片。
2.假如誰人對象在Internet的某個遠端辦事器上,直接操作這個對象由於收集速度緣由能夠比擬慢,那我們可以先用Proxy來取代誰人對象。

總之准繩是,關於開支很年夜的對象,只要在應用它時才創立,這個准繩可認為我們節儉許多名貴的Java內存。所以,有些人以為Java消耗資本內存,我認為這和法式編制思緒也有必定的關系。

若何應用署理形式

以Jive服裝論壇t.vhao.net體系為例,拜訪服裝論壇t.vhao.net體系的用戶有多品種型:注冊通俗用戶、服裝論壇t.vhao.net治理者、體系治理者、旅客。注冊通俗用戶能力談話,服裝論壇t.vhao.net治理者可以治理他被受權的服裝論壇t.vhao.net,體系治理者可以治理一切事務等,這些權限劃分和治理是應用Proxy完成的。

Forum是Jive的焦點接口,在Forum中擺設了有關服裝論壇t.vhao.net操作的重要行動,如服裝論壇t.vhao.net稱號,服裝論壇t.vhao.net描寫的獲得和修正,帖子揭橥刪除編纂等。

在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的稱號,只要服裝論壇t.vhao.net治理者或體系治理者可以修正,代碼以下:

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.vhao.net治理者才可以修正稱號
  if (permissions.isSystemOrForumAdmin()) {
   forum.setName(name);
  }
  else {
   throw new UnauthorizedException();
  }
    }
    ...

}

而DbForum才是接口Forum的真正完成,以修正服裝論壇t.vhao.net稱號為例:


public class DbForum implements Forum, Cacheable {
    ...
    public void setName(String name) throws ForumAlreadyExistsException {
  ....
  this.name = name;
  //這裡真正將新稱號保留到數據庫中
  saveToDb();
  ....
    }
    ...
}

但凡觸及到對服裝論壇t.vhao.net稱號修正這一事宜,其他法式都起首得和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服裝論壇t.vhao.net體系中其他如帖子的創立和應用,都是依照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形式的運用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved