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

时间: 2024-10-06 20:01:22

【设计优化】- 正确使用 Value Object 模式的相关文章

Java程序性能优化——设计优化

原文出自:http://blog.csdn.net/anxpp/article/details/51914119,转载请注明出处,谢谢! 1.前言 OK,之前写了一篇文章:"23种设计模式介绍以及在Java中的应用"详细介绍了如何将设计模式应用到Java编程中,而本文旨在介绍如何利用他们优化我们的程序,使其性能更佳. 设计模式的详细介绍请参照上面链接中的文章,不是本文的重点. 而Java程序的性能优化,不一定就仅仅是以提高系统性能为目的的,还可能是以用户体验.系统可维护性等为目的. 2

Web交互设计优化的简易check list

Web交互设计优化的简易check list 00 | 时间: 2011-02-11 | 28,842 Views 交互设计, 用户研究 “优化已有产品的体验”,这是用户体验相关岗位职责中常见的描述.我们的产品常常是在快速的迭代过程中不断完善的,就像孩子生下来需要养育才能长大一样,优化已有功能/产品,和设计新功能/产品同样重要,不可偏废. 但是,相比实现新功能,已有功能的优化总是显得没有那么紧迫而且很零散,导致了迭代优化的计划总是被归入“重要不紧急”甚至是“不重要不紧急”的象限,变成了东一棒子西

高并发,大容量,高性能数据库设计优化

1.数据存储 a.集中式---->分布式 复制m/s.切分 a.1切分 垂直切分(按功能模块) 难点:跨域的表关联--->应用程序 事务---------->分布式的事务(单独数据源的小事务,然后通过程序控制) 某些表访问剧增----->读写分离 读写分离(异构数据源之间的读写分离) 相同数据源,只需要master/slave 难点:异构数据源之间的全量复制问题 异构数据源之间的增量同步问题(解析日志) 水平切分(按记录切分---->找规则) a.2 数据切分及整合的中间件

(数字IC)低功耗设计入门(六)——门级电路低功耗设计优化

三.门级电路低功耗设计优化 (1)门级电路的功耗优化综述 门级电路的功耗优化(Gate Level Power Optimization,简称GLPO)是从已经映射的门级网表开始,对设计进行功耗的优化以满足功耗的约束,同时设计保持其性能,即满足设计规则和时序的要求.功耗优化前的设计是已经映射到工艺库的电路,如下图所示: 门级电路的功耗优化包括了设计总功耗,动态功耗以及漏电功耗的优化.对设计做优化时,优化的优先次序如下: 由此我们可以找到, 优化时,所产生的电路首先要满足设计规则的要求,然后满足延

hbase表设计优化原则 ***** 生产环境中使用小结

2019/2/28 星期四 hbase表设计优化原则 https://www.cnblogs.com/qingyunzong/p/8696962.html表设计1.列簇设计 追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇. 最优设计是:将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率 最高,也能保持尽可能少的访问不同的磁盘文件. 以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在 另一列族.2.RowKey 设计 HBas

Java多线程编程模式实战指南(二):Immutable Object模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-object.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安

Java多线程编程模式实战指南(一):Active Object模式--转载

本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-object-part1 .转载请注明作者: 黄文海 出处:http://viscent.iteye.com. Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心

《Java程序性能优化》学习笔记 Ⅰ设计优化

豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞吐量: 响应时间: 2.木桶定律   系统的最终性能取决于系统中性能表现最差的组件,例如window系统内置的评分就是选取最低分.可能成为系统瓶颈的计算资源如,磁盘I/O,异常,数据库,锁竞争,内存等. 性能优化的几个方面,如设计优化,Java程序优化,并行程序开发及优化,JVM调优,Java性能调

Java多线程编程模式实战指南一:Active Object模式(上)

Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它允许任务的提交(相当于对异步方法的调用)和任务的执行(相当于异步方法的真正执行)分离.这有点类似于System.gc()这个方法:客户端代码调用完gc()后,一个进行垃圾回收的任务被提交,但此时JVM并不一定进行了垃圾回收,而可能是在gc()方法调用返回后的某段时间才开始执行任务--回收垃圾.我们知