跟《HeadFirst設計模式》中一樣,我也不準備講普通的代理模式,而要專門介紹一下Java的遠端代理,也就是RMI。
遠端代理的類圖很簡單,隻有一個接口和一個實作類:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TO2MTN1IzMwIjNwUDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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結合可以建立非常強大的分布式應用。