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 模式的结构中,为了获取一份订单信息,只需要进行一次网络通信,缩短了数据存取的时响应时间,减少了网络数据流量,提高了性能,也能使系统接口具有更好的可维护性

发布了37 篇原创文章 · 获赞 16 · 访问量 6050

猜你喜欢

转载自blog.csdn.net/qq_44039966/article/details/103169140