将对象组合成树形结构以表示”部分-整体”的层次结构,Composite模式使得用户对单个对象和组合对象的使用具有一致性。
Component(抽象构件接口)
Leaf(叶部件)
Composite(组合类)
Client(客户端)
// Component:public abstract class Component {
public abstract void doSomething(); public void addChild(Component child){ throw new UnsupportedOperationException("对象不支持这个功能");
} public void removeChild(Component child){ throw new UnsupportedOperationException("对象不支持这个功能");
} public Component getChildren(int index){ throw new UnsupportedOperationException("对象不支持这个功能");
} public List<Component> getAll(){ throw new UnsupportedOperationException("对象不支持这个功能");
}
}// Leaf:public class Leaf extends Component {
private String name; public Leaf(String name){ this.name = name;
} @Override
public void doSomething() {
System.out.println(name);
}
}// Composite:public class Composite extends Component {
private List<Component> list; //遍历所有元素
@Override
public void doSomething() { if(list != null && list.size()!=0){ //如果是Composite对象 会递归
list.forEach(element -> element.doSomething());
}else {
System.out.println("元素为空");
}
} @Override
public void addChild(Component child) { if(list == null){
list = new ArrayList<>();
}
list.add(child);
} @Override
public void removeChild(Component child) { if(list != null){
list.remove(child);
}
} @Override
public Component getChildren(int index) { if(list != null){ if(index >= 0 && index < list.size()){ return list.get(index);
}
} return null;
} @Override
public List<Component> getAll() { return this.list;
}
}//Clientpublic class Client {
public static void main(String[] args) { //定义所有的组合对象
Component root = new Composite("服装");
Component c1 = new Composite("男装");
Component c2 = new Composite("女装"); //定义所有的叶子对象
Component leaf1 = new Leaf("衬衣");
Component leaf2 = new Leaf("夹克");
Component leaf3 = new Leaf("裙子");
Component leaf4 = new Leaf("套装"); //按照树的结构来组合组合对象和叶子对象
root.addChild(c1);
root.addChild(c2);
c1.addChild(leaf1);
c1.addChild(leaf2);
c2.addChild(leaf3);
c2.addChild(leaf4); //调用根对象的输出功能来输出整棵树
root.doSomething();
}
}
商品的类别树:
+服装
+男装
-衬衣 -夹克 +女装
-裙子 -套装
对于这种具有整体与部分的关系,并能组合成树形结构的对象结构,对它们用统一的方式进行操作。—>组合模式
组合模式(Composite)的关键就在于这个父抽象类,这个抽象类既可以代表叶子对象,也可以代表组合对象,这样用户在操作的时候,对单个对象和组合对象的使用就具有一致性。