设计模式——Composite(组合/合成)模式

前言

合成模式又被叫做组成模式

合成模式
书面用语

合成模式的意图是为了保证客户端调用单对象与组合对象的一致性

大白话

合成模式简化描述就是,为具有树形特征(A包含B,B包含C,C包含D)的对象集合提供一种抽象,使得调用该对象集合与调用该对象集合中的某一个对象在调用形式上(实现同一个抽象方法)保持一致
方法名保持一致,单个对象内部是单个实现,集合形式的对象内部是递归实现

构造一个场景
场景描述
  • 一家公司有很多的部门,部门里有不同的员工
  • 部门可能会有所调整,比如新增部门或者减少部门
  • 部门内部可以再次细化,成立子部门
  • 为这个公司提供一个计算员工总数的方法
场景探究
  • 公司、部门和员工具有一定的层级关系
  • 公司包含部门,部门包含员工
  • 部门可以包含子部门
  • 公司的总人数是部门的员工和
合成模式给出的解决方案
为公司、部门、员工提供一个抽象类
  • 公司可以添加或者去除部门以及得到员工总数
  • 部门可以添加、去除员工以及得到员工总数
  • 员工可以得到员工总数,恒为1
  • UML 图
    在这里插入图片描述
代码

针对上面的场景提供下面的代码

  • Basic 抽象类
public abstract class Basic {
	/**
	 * 获取员工总数
	 * @return
	 */
	abstract int getSumOfStaff(int sum);
}
  • Staff 员工类
/**
 * 员工类
 * @author wujie
 */
public class Staff extends Basic {
	@Override
	int getSumOfStaff(int sum) {
		sum+=1;
		return sum;
	}
}
  • Company 公司类
import java.util.List;
/**
 * 公司类
 * @author wujie
 */
public class Company extends Basic {
	/**
	 * 包含的部门
	 */
	private List<Basic> list;
	@Override
	int getSumOfStaff(int sum) {
		for(Basic basic:list){
			sum=basic.getSumOfStaff(sum);
		}
		return sum;
	}
	public List<Basic> getList() {
		return list;
	}
	public void setList(List<Basic> list) {
		this.list = list;
	}
}
  • Department (子)部门类
/**
 * 部门类
 * @author wujie
 *
 */
public class Department extends Basic {
	/**
	 * 本部门包含的员工或者子部门
	 */
	private List<Basic> list;

	@Override
	int getSumOfStaff(int sum) {
		for(Basic basic:list){
			sum=basic.getSumOfStaff(sum);
		}
		return sum;
	}

	public List<Basic> getList() {
		return list;
	}

	public void setList(List<Basic> list) {
		this.list = list;
	}
}
  • 运行举例
/**
	 * 一个企业有两个部门
	 * 一个部门有1个员工和一个子部门,子部门有一个员工
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		//公司类声明对象
		Company company=new Company();
		
		//公司类的部门集合
		List<Basic> departmentList=new ArrayList();
		company.setList(departmentList);
		
		//部门一:添加一个员工
		Department d1=new Department();
		
		//部门1添加到公司
		departmentList.add(d1);
		
		List<Basic> staff1List=new ArrayList();
		d1.setList(staff1List);
		
		Staff staff1=new Staff();
		
		staff1List.add(staff1);		
		
		
		Department d11=new Department();
		staff1List.add(d11);
		
		List<Basic> staff11List=new ArrayList();
		d11.setList(staff11List);
		
		Staff staff11=new Staff();
		
		staff11List.add(staff11);		
		
		
		int sum=0;
		System.out.println(company.getSumOfStaff(sum));
		
	}
合成模式 适用场景
  • 存在集合对象和单一对象具有同种操作需要的场景
  • 结合对象具有总-子关系
  • 可以按照树形结构遍历集合对象

Head First

通用 UML 图

在这里插入图片描述

组合模式设计菜单 UML

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值