《Head First 設計模式》之代理模式

代理模式(Proxy):控制對象訪問

  ——爲另外一個對象提供一個替身或佔位符來訪問這個對象。git

要點:程序員

  • 代理模式有許多變體,如:緩存代理、同步代理、防火牆代理和寫入時複製代理
  • 代理在結構上相似裝飾者,但目的不一樣。
  • 裝飾者模式爲對象加上行爲,而代理則是控制訪問。

爲上一章的糖果機創建一個糖果監視器,在遠程監控糖果機。緩存

 


 

遠程方法:服務器

  • 客戶輔助對象(Client helper)並不真正擁有客戶所指望的方法邏輯,它會聯繫服務器,傳送方法調用信息,而後等待服務器返回。
  • 在服務器端,服務輔助對象(Service helper)從客戶輔助對象中接收請求(經過Socket鏈接),將調用的信息解包,而後調用真正服務對象上的方法。
  • 對於服務對象(Service object)來講,調用是本地的,來自服務輔助對象,而不是遠程客戶。
  • 服務輔助對象獲得返回值,將它打包,而後運回到客戶輔助對象(經過網絡Socket的輸出流),客戶輔助對象將信息解包,最後將返回值交給客戶對象。

  • Java RMI:Remote Method Invocation 遠程方法調用。網絡

  • 原語(primitive)類型工具

  • 可序列化(Serializable)類型spa

製做遠程服務:3d

步驟1:製做遠程接口。遠程接口定義出可讓客戶遠程調用的方法。客戶將用它做爲服務的類類型。Stub和實際的服務都實現此接口。代理

步驟2:製做遠程的實現。這是作實際工做的類,爲遠程接口中定義的遠程方法提供了真正的實現。這就是客戶真正想要調用的方法的對象(例如,咱們的GumballMachine)。對象

步驟3:利用rmic產生的stub和skeleton。這就是客戶和服務的輔助類。你不須要本身建立這些類,甚至連生辰它們的代碼都不用看,由於當你運行rmic工具時,這都會自動處理。你能夠在JDK中找到rmic。

步驟4:啓動RMI Registry(rmiregistry)。rmiregistry就像是電話簿,客戶能夠從中查到代理的位置(也就是客戶的stub helper對象)。

步驟5:開始遠程服務。你必須讓服務對象開始運行。你的服務實現類會去實例化一個服務的實例,並將這個服務註冊到RMI registry。註冊以後,這個服務就能夠供客戶調用了。

 

注意:對於RMI,程序員最常犯的三個錯誤

一、忘了在啓動遠程服務以前先啓動rmiregistry(要用Naming.rebind()註冊服務,rmiregitry必須是運行的)。

二、忘了讓變量和返回值的類型成爲可序列化的類型(這種錯誤沒法在編譯期返現,只會在運行時發現)。

三、忘了給客戶端提供stub類。


 

代理模式:

  • 遠程代理

  • 虛擬代理 :虛擬代理控制訪問實例化開銷大的對象。

  • 保護代理 :保護代理基於調用者控制對對象方法的訪問。
相關文章
相關標籤/搜索