1.简介
组合模式是结构性模式的一种。主要的作用是把多个对象使用一个对象来使用。多个对象之前的关系是派生的关系。 日常生活中的实例多见于公司的人员管理,例如公司的人员关系,A高管管理N个部门,每个部门有M个人,人员关系就是一个倒立的树状。通常各种OA软件的权限管理,菜单管理也是这种组合方式。 我在工作中碰到过菜单的组装和订单的组合拆分两种实际情况。此处使用订单来模拟。
2.代码实现
2.1 POJO Order
public class Order {
private int money
;
private List
<Order> orders
;
}
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);
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中。