将对象组合成树形结构以表示 部分-整体 的层次结构,使用户对单个对象和组合对象的使用具有一致性
适用场合:忽略组合对象与单个对象的不同,统一使用组合结构中的所有对象
Company.java
package com.gary.designpattern.composite;
/**
* 公司类
* @author gary
*
*/
public abstract class Company {
protected String name;
public Company(){
}
public Company(String name) {
this.name = name;
}
public void printName(){
System.out.println(name);
}
//增
public abstract void add(Company company);
//删
public abstract void delete(Company company);
//查
public abstract void show(int depth);
}
ConcreteCompany.java
package com.gary.designpattern.composite;
import java.util.ArrayList;
import java.util.List;
/**
* 存储子节点
* @author gary
*
*/
public class ConcreteCompany extends Company {
private List<Company> children = new ArrayList<Company>();
public ConcreteCompany(String name) {
this.name = name;
}
@Override
public void add(Company company) {
children.add(company);
}
@Override
public void delete(Company company) {
children.remove(company);
}
@Override
public void show(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
printName();
for (int i = 0; i < children.size(); i++) {
children.get(i).show(depth + 1);
}
}
}
DepartmentA.java
package com.gary.designpattern.composite;
/**
* 部门A
* @author gary
*
*/
public class DepartmentA extends Company {
public DepartmentA(String name) {
this.name = name;
}
/**
* 叶子节点无子节点
*/
@Override
public void add(Company company) {
}
/**
* 叶子节点无子节点
*/
@Override
public void delete(Company company) {
}
@Override
public void show(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
printName();
}
public void functionA(){
System.out.println("function A");
}
}
DepartmentB.java
package com.gary.designpattern.composite;
/**
* 部门B
* @author gary
*
*/
public class DepartmentB extends Company {
public DepartmentB(String name) {
this.name = name;
}
/**
* 叶子节点无子节点
*/
@Override
public void add(Company company) {
}
/**
* 叶子节点无子节点
*/
@Override
public void delete(Company company) {
}
@Override
public void show(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
printName();
}
public void functionB(){
System.out.println("function B");
}
}
DepartmentC.java
package com.gary.designpattern.composite;
/**
* 部门C
* @author gary
*
*/
public class DepartmentC extends Company {
public DepartmentC(String name) {
this.name = name;
}
/**
* 叶子节点无子节点
*/
@Override
public void add(Company company) {
}
/**
* 叶子节点无子节点
*/
@Override
public void delete(Company company) {
}
@Override
public void show(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("-");
}
printName();
}
public void functionC(){
System.out.println("function C");
}
}
Test.java
package com.gary.designpattern.composite;
/**
* 测试
* @author gary
*
*/
public class Test {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("总公司");
ConcreteCompany company1 = new ConcreteCompany("分公司1");
company1.add(new DepartmentA("分公司1部门1"));
company1.add(new DepartmentB("分公司1部门2"));
company1.add(new DepartmentC("分公司1部门3"));
ConcreteCompany company2 = new ConcreteCompany("分公司2");
company2.add(new DepartmentA("分公司2部门1"));
company2.add(new DepartmentB("分公司2部门2"));
ConcreteCompany company3 = new ConcreteCompany("分公司3");
company3.add(new DepartmentA("分公司3部门1"));
root.add(company1);
root.add(company2);
root.add(company3);
root.show(1);
}
}