在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 模型便实现了!
时间: 2024-10-06 20:01:22