设计模式-组合模式

    技术2022-09-01  85

    1.简介

    组合模式是结构性模式的一种。主要的作用是把多个对象使用一个对象来使用。多个对象之前的关系是派生的关系。 日常生活中的实例多见于公司的人员管理,例如公司的人员关系,A高管管理N个部门,每个部门有M个人,人员关系就是一个倒立的树状。通常各种OA软件的权限管理,菜单管理也是这种组合方式。 我在工作中碰到过菜单的组装和订单的组合拆分两种实际情况。此处使用订单来模拟。

    2.代码实现

    2.1 POJO Order

    public class Order { private int money; private List<Order> orders; // 省略set/get ... }

    2.2 合并方法(正向组合)

    静态方法合并订单组合成单个对象 private static Order mergeOrders(List<Order> orders) { Order var0 = new Order(); List<Order> orders1 = new ArrayList<>(); orders.forEach(order -> { orders1.add(order); var0.setMoney(var0.getMoney() + order.getMoney()); }); var0.setOrders(orders1); return var0; } 调用实例 Order v0 = JSON.parseObject("{\"money\":100}",Order.class); Order v1 = JSON.parseObject("{\"money\":101}",Order.class); Order v2 = JSON.parseObject("{\"money\":102}",Order.class); Order v3 = JSON.parseObject("{\"money\":103}",Order.class); Order v4 = JSON.parseObject("{\"money\":104}",Order.class); // 规则 v0 先合并 v1 ,返回结果后续依次合并到v4 Order result0 = mergeOrders(Arrays.asList(v1,v0)); Order result1 = mergeOrders(Arrays.asList(v2,result0)); Order result2 = mergeOrders(Arrays.asList(v3,result1)); Order result3 = mergeOrders(Arrays.asList(v4,result2)); 合并结果对象

    最终结果对象result3,对应money的子order,从金额上可以看出v0-v4

    2.3 拆分方式 (反向拆分)

    通过上述合并的结果进行拆分成五个订单。

    静态方法 private static void splitOrders(Order order, List<Order> result) { List<Order> orders = order.getOrders(); orders.forEach(var0 -> { if (var0.getOrders() != null) { splitOrders(var0, result); } else { result.add(var0); } order.setMoney(order.getMoney() - var0.getMoney()); }); } 调用方法 List<Order> orders = new ArrayList<>(); splitOrders(result3,orders); 拆分结果

    3. 总结和扩展

    对于这种设计模式,我在工作中遇到的次数不多,拆分的时候一定要注意测试,递归的场景容易造成死循环。 对于这种数据的存储,相对于关系型数据库例如MySQL和Oracle ,其实更适合存储在MongDB中。

    Processed: 0.014, SQL: 9