一、客户订单的目的地问题
二、组合模式
---------把一组相似的对象当作一个单一的对象,为的是减少数据类型。
1、定义一个抽象对象,它可以表示两种或多种实际类型的对象
2、在对象内部,聚合一个抽象类型对象
3、构造时,递归这种关系
4、适合构造属性结构的对象关系
三、代码实例
抽象数据类型
/**
* 节点结构-组合
*/
public abstract class Node {
private String name;
public Node(String name){
this.name = name;
}
/**
* 抽象方法
* @return
*/
public abstract List<Node> getChildren();
public String getName() {
return name;
}
}
叶子结点
/**
* 叶子节点
*/
public class LeafNode extends Node{
public LeafNode(String name) {
super(name);
}
@Override
public List<Node> getChildren() {
return null;
}
}
非叶子结点
/**
* 区域划分节点-非叶子节点
*/
public class DistrictNode extends Node{
// 成员变量 Node 集合
private List<Node> children = new ArrayList<>();
public DistrictNode(String name) {
super(name);
}
// 返回集合
@Override
public List<Node> getChildren() {
return children;
}
// 集合增加
public void addChild(Node node){
children.add(node);
}
// 集合减少
public void delChild(int i){
children.remove(i);
}
}
客户端
/**
* 组合模式
* 省市县目录组织结构
*/
public class CompositeClient {
public static void main(String[] args){
sendFruit();
}
public static void sendFruit(){
// 根目录 - 创建根节点
DistrictNode root = new DistrictNode("根");
//一线目录 - 添加中间节点
root.addChild(new DistrictNode("上海"));
root.addChild(new DistrictNode("天津"));
DistrictNode beijing_Node = new DistrictNode("北京");
root.addChild(beijing_Node);
//二级目录 - 添加中间节点
beijing_Node.addChild(new DistrictNode("海淀区"));
beijing_Node.addChild(new DistrictNode("西城区"));
DistrictNode chaoyang_Node2 = new DistrictNode("朝阳区");
beijing_Node.addChild(chaoyang_Node2);
//三级目录 - 添加叶子节点
chaoyang_Node2.addChild(new LeafNode("三里屯"));
chaoyang_Node2.addChild(new LeafNode("朝阳外街"));
System.out.println(JSON.toJSON(root));
}
}