【設計優化】- 正確使用 Value Object 模式
阿新 • • 發佈:2018-12-31
在J2EE 軟體開發中,通常會對系統模組進行分層,如下圖所示:
展示層主要負責資料的展示,業務路基層負責具體的業務邏輯處理,而持久層負責資料庫等持久化操作。
大型系統中,這些層次很有可能會被分離,部署在不同的伺服器上。而在兩個層次之間可能通過遠端呼叫 RMI 等方式進行通訊。例如有一個訂單,有客戶姓名、產品名稱和編號三個屬性,獲取一個訂單的過程如上圖,要進行3次資料互動。
雖然這種模式可行,卻有兩個嚴重的問題:
第一,以面向物件設計的角度來看,這種方式不合理,繁瑣且不具有較好的維護性。
第二,一個訂單進行3次通訊,效能太低。
為了解決這個問題,就可以使用 Value Object 模式。這種模式提倡將一個物件的各個屬性進行封裝,將封裝後的物件在網路中傳播,從而使系統擁有更好的互動模型,並且減少網路通訊資料,從而提高系統性能。
經過優化,得到下圖的架構模型:
這樣只需要進行一次遠端呼叫便可以得到完整的 Order 資訊,縮短了存取的響應時間,減少了網路資料流量。
要實現這樣的模型,我們需要五部分。
第一個角色是訂單那資訊的載體:Order 實體類
public class Order implements Serializable{ private static final long serialVersionUID = -426476071552949121L; private int orderId; private String clientName; private int number; private String productName; //省略 getter 和 setter 方法 }
第二個角色是 RMI 服務端被呼叫的服務介面:IOrderManager 介面
public interface IOrderManager extends Remote { public Order getOder(int id) throws RemoteException; public String getClientName(int id) throws RemoteException; public int getProdName(int id) throws RemoteException; public int getNumber(int id) throws RemoteException; }
第三個角色是服務端介面的實現類: OrderManager 物件
public class OrderManager extends UnicastRemoteObject implements IOrderManager{
private static final long serialVersionUID = 1924550532702082608L;
//限制了只有子類或本包類可以使用
protected OrderManager() throws RemoteException {
super();
}
@Override
public Order getOder(int id) throws RemoteException {
System.out.print("Request received! ID = "+ id);
Order o =new Order();
o.setClientName("zq");
o.setNumber(1);
o.setOrderId(2);
o.setProductName("Car");
return o;
}
@Override
public String getClientName(int id) throws RemoteException {
return "zq";
}
@Override
public int getProdName(int id) throws RemoteException {
return 0;
}
@Override
public int getNumber(int id) throws RemoteException {
return 1;
}
}
第四個角色是 RMI 伺服器: OrderManagerServer 類
public class OrderManagerServer {
public static void main(String[] args){
try{
LocateRegistry.createRegistry(1099);
IOrderManager userManager = new OrderManager();
Naming.bind("userManager", userManager);
System.out.println("OrderManager is ready!");
}catch (Exception e){
System.out.println("OrderManager Server failed:"+e);
}
}
}
第五個是客戶端: OrderCient 類
public class OrderManagerServer {
public static void main(String[] args){
try{
LocateRegistry.createRegistry(1099);
IOrderManager userManager = new OrderManager();
Naming.bind("userManager", userManager);
System.out.println("OrderManager is ready!");
}catch (Exception e){
System.out.println("OrderManager Server failed:"+e);
}
}
}
我們首先開啟服務端,然後再執行客戶端,執行結果分別如下:
服務端:OrderManager is ready!
Request received! ID = 1Request received! ID = 1
客戶端:zq
自此,一個簡單的 Value Object 模型便實現了!