Composite形式

Composite模式

将对象组合成树形结构以表示 部分-整体 的层次结构,使用户对单个对象和组合对象的使用具有一致性
适用场合:忽略组合对象与单个对象的不同,统一使用组合结构中的所有对象

 

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);
	}
}