简介:组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,
它创建了对象组的树形结构。
使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理,公司的人事管理(总经理和部门经理,部门经理和员工)。比如树形菜单有子级和父级,在定义时,只需要定义一个类,类种的属性指明该对象的父级对象是谁即可,这样子级和父级的菜单就都区分出来了。
注意:只需要定义一个类
下面的例子是关于军衔的,排长下面有班长,班长下面有列兵。但无论排长,班长,列兵,他们都是兵,所以在使用组合模式时,只需要定义一个类就可以了。
public class Soldier {
private String name;
private Rank rank;
private List<Soldier> soldiers=new LinkedList<>();
public void addSol(Soldier soldier){
this.soldiers.add(soldier);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Rank getRank() {
return rank;
}
public void setRank(Rank rank) {
this.rank = rank;
}
public List<Soldier> getSoldiers() {
return soldiers;
}
public void setSoldiers(List<Soldier> soldiers) {
this.soldiers = soldiers;
}
@Override
public String toString() {
return "Soldier [name=" + name + ", rank=" + rank + "]";
}
public Soldier(String name, Rank rank) {
super();
this.name = name;
this.rank = rank;
}
//打印所有的下级
public void showUnderSol(){
if(soldiers.size()>0){
for (Soldier soldier : soldiers) {
System.out.println(this.getName()+"的下级是:"+soldier);
}
}else{
System.out.println("基层人员,没有任何兵");
}
}
}
enum Rank{
Private,Monitor,PlatoonLeader;//分别表示列兵,班长和排长
}
主程序:
public class Main {
public static void main(String[] args) {
Soldier paiZhang=new Soldier("zhangSan",Rank.PlatoonLeader);
Soldier banZhangA=new Soldier("wangWu", Rank.Monitor);
Soldier banZhangB=new Soldier("liSi", Rank.Monitor);
Soldier lieBingA=new Soldier("siMa", Rank.Private);
Soldier lieBingB=new Soldier("xiaoMing", Rank.Private);
Soldier lieBingC=new Soldier("laoLi", Rank.Private);
Soldier lieBingD=new Soldier("heMa", Rank.Private);
//排长手下有两个班长
paiZhang.addSol(banZhangA);
paiZhang.addSol(banZhangB);
//班长A手下有两个兵
banZhangA.addSol(lieBingA);
banZhangA.addSol(lieBingB);
//班长B手下有另外两个兵
banZhangB.addSol(lieBingC);
banZhangB.addSol(lieBingD);
paiZhang.showUnderSol();
banZhangA.showUnderSol();
banZhangB.showUnderSol();
lieBingA.showUnderSol();
lieBingB.showUnderSol();
}
}
运行结果:
zhangSan的下级是:Soldier [name=wangWu, rank=Monitor]
zhangSan的下级是:Soldier [name=liSi, rank=Monitor]
wangWu的下级是:Soldier [name=siMa, rank=Private]
wangWu的下级是:Soldier [name=xiaoMing, rank=Private]
liSi的下级是:Soldier [name=laoLi, rank=Private]
liSi的下级是:Soldier [name=heMa, rank=Private]
基层人员,没有任何兵
基层人员,没有任何兵