1. 程式人生 > >【設計優化】- 正確使用 Value Object 模式

【設計優化】- 正確使用 Value Object 模式

在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 模型便實現了!