Java设计模式——Value Object(值对象)模式

问题引出
当客户端需要获取一个订单(Order)的信息,假设一个订单由客户名、商品名和数量构成,那么客户端需要与服务端交互三次,依次取得这些信息
在这里插入图片描述
这样设计是一种可行的方案,但存在两个严重的问题(出大问题

  1. 对于获取一个订单而言,这种操作模式过于繁琐,且不具备较好的可维护性

  2. 前后累计进行了三次客户端与服务端的通讯,性能成本较高

解决方法:Value Object(值对象)模式

Value Object 模式提倡将一个对象的各个属性进行封装,将封装后的对象在网络中传递,从而使系统拥有更好的交互模型,并且减少网络通信数据,从而提高系统性能。
在这里插入图片描述

// RMI服务端接口
public interface IOrderManager extends Remote {
    public Order getOrder(int id) throws RemoteException;

    public String getClientName(int id) throws RemoteException;

    public String getProdName(int id) throws RemoteException;

    public int getNumber(int id) throws RemoteException;
}
// 作为Value Object 的 Order 对象
public class Order implements Serializable {
    private int orderId;
    private String clientName;
    private int number;
    private String productName;

    public int getOrderId() {
        return orderId;
    }

    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }

    public String getClientName() {
        return clientName;
    }

    public void setClientName(String clientName) {
        this.clientName = clientName;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }
}
// 实现IOrderManager,返回数据(本来应该和数据库进行交互的,但为了方便直接返回确定值)
public class OrderManager extends UnicastRemoteObject implements IOrderManager {

    protected OrderManager() throws RemoteException {
        super();
    }
    private static final long serialVersionUID = -171703007581295639L;

    @Override
    public Order getOrder(int id) throws RemoteException {
        Order o = new Order();
        o.setClientName("TuoJun");
        o.setNumber(20);
        o.setProductName("rice");
        return o;
    }

    @Override
    public String getClientName(int id) throws RemoteException {
        return "TuoJun";
    }

    @Override
    public String getProdName(int id) throws RemoteException {
        return "rice";
    }

    @Override
    public int getNumber(int id) throws RemoteException {
        return 20;
    }
}
// 业务逻辑层,注册并开启RMI服务器
public class OrderManagerServer {
    public static void main(String[] args) {
        try {
            LocateRegistry.createRegistry(1099);                 // 注册RMI端口
            IOrderManager userManager = new OrderManager();         // RMI远程对象
            Naming.rebind("OrderManager", userManager);       // 绑定RMI对象
            System.out.println("OrderManager is ready");
        }catch (Exception e){
            System.out.println("OrderManager Server failded:" + e);
        }
    }
}
// 客户端的测试代码,分别展示了使用Value Object 模式封装数据和不使用Value Object 模式的性能差异
public class OrderClient {
    public static void main(String[] args) {
        try {
            IOrderManager userManager = (IOrderManager) Naming.lookup("OrderManager");
            long begin = System.currentTimeMillis();
            for (int i =0; i < 100; i++){
            	// 使用Value Object 模式封装数据
                userManager.getOrder(i);
            }
            System.out.println("Value Object模式花费的时间:" + (System.currentTimeMillis() - begin));

            begin = System.currentTimeMillis();
            for (int i =0; i < 100; i++){
           		// 不使用Value Object 模式封装数据
                userManager.getClientName(i);
                userManager.getNumber(i);
                userManager.getProdName(i);
            }
            System.out.println("传统模式花费的时间:" + (System.currentTimeMillis() - begin));
        }catch (Exception e){
            System.out.println("OrderManager Server failded:" + e);
        }
    }
}
// 运行结果
// OrderManagerServer 服务端
OrderManager is ready

// OrderClient 客户端
Value Object模式花费的时间:85
传统模式花费的时间:106

由此可见,对传输数据进行有效的封装,可以明显提升远程方法调用的性能

分析
在基于Value Object 模式的结构中,为了获取一份订单信息,只需要进行一次网络通信,缩短了数据存取的时响应时间,减少了网络数据流量,提高了性能,也能使系统接口具有更好的可维护性

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SDO(Service Data Object)是一种数据访问和操作的模型,它可以在不同的应用程序之间共享数据。SDO定义了一组API,用于访问和操作数据对象。在Java中,SDO的实现称为SDO for Java。 在SDO for Java中,DataObject是SDO的核心概念之一。DataObject是一个Java对象,它可以表示任意类型的数据。SDO for Java提供了一组API,用于创建、访问和操作DataObject。 DataObject具有以下特点: 1. 动态属性:DataObject可以动态添加和删除属性,而不需要在定义时指定属性。 2. 支持继承:DataObject可以继承自其他DataObject,继承可以实现数据的重用。 3. 支持多重:DataObject的属性可以是多重,可以包含多个。 4. 支持关联:DataObject可以与其他DataObject建立关联,形成一个对象图。 SDO for Java提供了一组API,用于访问和操作DataObject。例如,可以使用以下代码创建一个DataObject: ``` DataObject dataObject = dataFactory.create("uri", "typeName"); ``` 其中,dataFactory是SDO的工厂类,"uri"和"typeName"分别表示DataObject的命名空间和类型名。 创建DataObject后,可以使用以下代码设置和获取属性: ``` dataObject.set("propertyName", propertyValue); Object value = dataObject.get("propertyName"); ``` 其中,"propertyName"表示属性名,propertyValue表示属性。 除了设置和获取属性外,还可以使用以下代码访问DataObject的关联: ``` DataObject relatedObject = dataObject.getDataObject("associationName"); List<DataObject> relatedObjects = dataObject.getList("associationName"); ``` 其中,"associationName"表示关联名。getDataObject方法返回与DataObject建立关联的单个DataObject,getList方法返回与DataObject建立关联的多个DataObject。 总之,DataObject是SDO for Java的核心概念之一,它提供了一种灵活、动态、可扩展的数据访问和操作模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值