設計模式-組合模式
將對象組合成樹形結構來表示 “部分-整體”的層次結構。
葉子節點 和 支節點,支節點可以有支節點和葉子結點,葉子結點則不能有。
例子:
文件 -> 文件夾1(文件夾11(文件111),文件12)、文件2
公司、分公司、公司部門
公司分公司和子公司的例子:
公司抽象類:
import java.util.Comparator;
public abstract class Company implements Comparator {
protected String name;
protected int level = 0;
public Company(String name){
this.name = name;
}
public Company(String name,int level){
this.name = name;
this.level = level;
}
/**
* 添加
*/
abstract boolean add(Company c);
/**
* 刪除
*/
abstract boolean remove(Company c);
/**
* 顯示
*/
public void display(){
for (int i=0;i< level;i++){
System.out.print("--");
}
System.out.println(name+"("+level+")");
}
/**
* 僅僅是示範
*/
@Override
public int compare(Object o1, Object o2) {
return o1.hashCode() - o2.hashCode();
}
//getter and setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
具體的公司(支隊節點):
import java.util.ArrayList;
import java.util.List;
/**
* 實例公司
*/
public class ConcreteCompany extends Company {
private List<Company> children = new ArrayList<>();
public ConcreteCompany(String name) {
super(name);
}
public ConcreteCompany(String name,int level) {
super(name,level);
}
@Override
boolean add(Company c) {
c.level = this.level + 1;
return children.add(c);
}
@Override
boolean remove(Company c) {
return children.remove(c);
}
@Override
public void display() {
super.display();
children.forEach(Company::display);
}
}
公司下的部門(葉子節點)
/**
* 部門
*/
public class DeptCompany extends Company{
public DeptCompany(String name) {
super(name);
}
@Override
boolean add(Company c) {
return false;
}
@Override
boolean remove(Company c) {
return false;
}
/* @Override
void display() {
System.out.println(name);
}*/
}
如果使用:
public static void main(String[] args) {
Company mainCompany = new ConcreteCompany("總公司",0);
mainCompany.add(new DeptCompany("總公司人力部門"));
mainCompany.add(new DeptCompany("總公司財務部門"));
Company shC = new ConcreteCompany("上海分公司");
Company gdC = new ConcreteCompany("廣東分公司");
Company hb = new ConcreteCompany("湖北分公司");
mainCompany.add(shC);
mainCompany.add(gdC);
mainCompany.add(hb);
shC.add(new DeptCompany("上海人事部"));
shC.add(new DeptCompany("上海財政部"));
gdC.add(new DeptCompany("廣東市場部"));
gdC.add(new DeptCompany("廣東研發部"));
gdC.add(new DeptCompany("廣東應急部"));
mainCompany.display();
}
測試結果:
總公司(0)
--總公司人力部門(1)
--總公司財務部門(1)
--上海分公司(1)
----上海人事部(2)
----上海財政部(2)
--廣東分公司(1)
----廣東市場部(2)
----廣東研發部(2)
----廣東應急部(2)
--湖北分公司(1)
組合模式 就是樹形結構來存儲 整體 和 部分 的層次結構。
還是比較簡單的,因爲我們都熟悉樹形結構。