首页 > 代码库 > 【设计优化】- 正确使用 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 模型便实现了!

【设计优化】- 正确使用 Value Object 模式