设计模式-组合模式
将对象组合成树形结构来表示 “部分-整体”的层次结构。
叶子节点 和 支节点,支节点可以有支节点和叶子结点,叶子结点则不能有。
例子:
文件 -> 文件夹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)
组合模式 就是树形结构来存储 整体 和 部分 的层次结构。
还是比较简单的,因为我们都熟悉树形结构。