天天看點

代理模式:控制對對象的通路

跟《HeadFirst設計模式》中一樣,我也不準備講普通的代理模式,而要專門介紹一下Java的遠端代理,也就是RMI。

遠端代理的類圖很簡單,隻有一個接口和一個實作類:

代理模式:控制對對象的通路

DuckServer是一個繼承了Remote的接口,其中有一個等待實作的quack方法。Duck是DuckServer的實作類,繼承自UnicastRemoteObject。

Duck中有一個程式主方法main,這樣Duck是一個可執行的Java類。main方法中注冊了DuckServer遠端服務:

publicstatic void main(String[] args) {

try{

DuckServerduckServer = new Duck();

Naming.rebind("DuckServer",duckServer);

}catch (RemoteException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}catch (MalformedURLException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

}

以下的代碼用來調用遠端服務:

publicvoid testQuack() {

try{

DuckServerduckServer = (DuckServer)Naming.lookup("rmi://127.0.0.1/DuckServer");

Strings = duckServer.quack();

System.out.println(s);

}catch (MalformedURLException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}catch (RemoteException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}catch (NotBoundException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

}

當然,在調用遠端服務前需要先運作rmiregistry服務,并運作遠端代理的服務端(在本例子中,即Duck類)。

順便提一句,RMI和Hadoop結合可以建立非常強大的分布式應用。

繼續閱讀