JAVA设计模式(12)结构型-组合模式

这篇博客介绍了如何利用组合模式(Composite Pattern)来构建一个企业的组织结构。通过抽象类`Company`作为基础,创建了`ConcreteCompany`、`FinanceDepartment`和`HRDepartment`等具体组件,实现了树形结构的组织层级。在`ConcreteCompany`中,使用ArrayList存储子公司或部门,并实现了添加、删除和显示方法。客户端代码展示了如何创建和展示整个组织结构,使得处理复杂和简单的组织单元变得一致,达到解耦的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。组合模式让你可以优化处理递归或分级数据结构。

package design.composite;
/** 
 * author: V:jbossjf
 */
public abstract class Company {
	private String name;
 
	public Company(String name) {
		this.name = name;
	}
 
	public Company() {
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	protected abstract void add(Company company);
 
	protected abstract void romove(Company company);
 
	protected abstract void display(int depth);
}
 
 
 
 
package design.composite;
 
import java.util.ArrayList;
import java.util.List;
/**
 * @author: V:jbossjf
 * 
 */
public class ConcreteCompany extends Company {
	private List<Company> cList;
 
	public ConcreteCompany() {
		cList = new ArrayList<Company>();
	}
 
	public ConcreteCompany(String name) {
		super(name); 
		cList = new ArrayList<Company>() ; 
	}
 
	@Override
	protected void add(Company company) {
		cList.add(company);
	}
 
	@Override
	protected void display(int depth) {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder("");
		for (int i = 0; i < depth; i++) {
			sb.append("-"); 
		}
		System.out.println(new String(sb) + this.getName());
		for (Company c : cList) {
			c.display(depth + 2);
		}
	}
 
	@Override
	protected void romove(Company company) {
		cList.remove(company);
	}
}
 
 
 
package design.composite;
/**
 * author: V:jbossjf 
 */
public class FinanceDepartment extends Company {
	
	
	public FinanceDepartment(){
		
	}
	
	public FinanceDepartment(String name){
		super(name);
	}
	
	@Override
	protected void add(Company company) {
 
	}
 
	@Override
	protected void display(int depth) {
		StringBuilder sb = new StringBuilder("");
		for (int i = 0; i < depth; i++) {
			sb.append("-");
		}
		System.out.println(new String(sb) + this.getName() ) ; 
	}
 
	@Override
	protected void romove(Company company) {
		
	}
	
}
 
 
 
 
package design.composite;
/**
 *@author: V:jbossjf 
 */
public class HRDepartment extends Company {
	
	
	public HRDepartment(){
		
	}
	
	public HRDepartment(String name){
		super(name);
	}
	
	@Override
	protected void add(Company company) {
 
	}
 
	@Override
	protected void display(int depth) {
		StringBuilder sb = new StringBuilder("");
		for (int i = 0; i < depth; i++) {
			sb.append("-"); 
		}
		System.out.println(new String(sb) + this.getName() ) ; 
	}
 
	@Override
	protected void romove(Company company) {
		
	}
	
}
 
 
 
 
package design.composite;
 
public class Client {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Company root = new ConcreteCompany();
		root.setName("北京总公司");
		root.add(new HRDepartment("总公司人力资源部"));
		root.add(new FinanceDepartment("总公司财务部"));
		Company shandongCom = new ConcreteCompany("山东分公司");
		shandongCom.add(new HRDepartment("山东分公司人力资源部"));
		shandongCom.add(new FinanceDepartment("山东分公司账务部"));
		Company zaozhuangCom = new ConcreteCompany("枣庄办事处");
		zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));
		zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));
		Company jinanCom = new ConcreteCompany("济南办事处");
		jinanCom.add(new FinanceDepartment("济南办事处财务部"));
		jinanCom.add(new HRDepartment("济南办事处人力资源部")); 
		shandongCom.add(jinanCom);
		shandongCom.add(zaozhuangCom);
		Company huadongCom = new ConcreteCompany("上海华东分公司");
		huadongCom.add(new HRDepartment("上海华东分公司人力资源部"));
		huadongCom.add(new FinanceDepartment("上海华东分公司账务部"));
		Company hangzhouCom = new ConcreteCompany("杭州办事处");
		hangzhouCom.add(new FinanceDepartment("杭州办事处财务部"));
		hangzhouCom.add(new HRDepartment("杭州办事处人力资源部"));
		Company nanjingCom = new ConcreteCompany("南京办事处");
		nanjingCom.add(new FinanceDepartment("南京办事处财务部"));
		nanjingCom.add(new HRDepartment("南京办事处人力资源部"));
		huadongCom.add(hangzhouCom);
		huadongCom.add(nanjingCom); 
		root.add(shandongCom);
		root.add(huadongCom);
		root.display(0);
	}
 
}
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值