文章目录
前言
组合模式是将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。
一、介绍
组合设计模式又叫部分整体模式,将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。使用户可以通过一致的方法操作单个对象或组合对象,整体和部分的基本操作多数都是一样的,也会有不同的地方。组合模式可以用一棵树来表示。
二、详细分析
1.核心组成
- 组合部件(Component):它是一个抽象接口,表示树根;
- 合成部件(Composite):和组合部件类似,也有自己的子节点;
- 叶子(Leaf):在组合中表示子节点对象,注意他是没有子节点。
公司底下有部门,部门底下有职位。以下所示:
2.实现步骤
- 创建组合部件,他是个抽象类,定义部件中的属性和方法;
- 创建合成部件,继承组合部件,创建集合属性,用来管理叶子节点;
- 创建叶子节点,继承组合部件,不能添加子节点。
3.代码示例
组合部件
/**
* 组合部件
*/
public abstract class Company {
private String job;
public Company(String job) {
this.job = job;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
/**
* 添加职位
*/
protected abstract void addJob(Company company);
/**
* 删除职位
*/
protected abstract void removeJob(Company company);
/**
* 展示职位
* @param depth 显示层级
*/
protected abstract void display(int depth);
}
合成部件
/**
* 合成部件
*/
public class Department extends Company {
List<Company> companyList = new ArrayList<Company>();
public Department(String job) {
super(job);
}
@Override
protected void addJob(Company company) {
companyList.add(company);
}
@Override
protected void removeJob(Company company) {
companyList.remove(company);
}
@Override
protected void display(int depth) {
StringBuffer str= new StringBuffer();
for (int i=0;i<depth;i++){
str.append("-");
}
// 输出
System.out.println(str.toString()+this.getJob());
//子层级再加2
for (Company company:companyList){
company.display(depth+2);
}
}
}
叶子节点
/**
* 叶子节点
*/
public class Job extends Company{
public Job(String job) {
super(job);
}
@Override
protected void addJob(Company company) {
}
@Override
protected void removeJob(Company company) {
}
@Override
protected void display(int depth) {
StringBuffer str= new StringBuffer();
for (int i=0;i<depth;i++){
str.append("-");
}
// 输出
System.out.println(str.toString()+this.getJob());
}
}
测试类:
public static void main(String[] args) {
// 创建根
Company company = new Department("北京公司");
// 创建部门节点
Company dept = new Department("软件开发部门");
Company dept2 = new Department("软件测试部门");
Company dept3 = new Department("产品部门");
// 创建叶子节点并添加至部门
Company job= new Job("软件开发经理");
Company job1 = new Job("软件开发工程师");
dept.addJob(job);
dept.addJob(job1);
Company job2 = new Job("软件测试工程师");
dept2.addJob(job2);
Company job3 = new Job("产品经理");
dept3.addJob(job3);
company.addJob(dept);
company.addJob(dept2);
company.addJob(dept3);
company.display(0);
}
结果
4.优缺点
优点
- 组合模式定义了一组统一的接口,可以用来处理单个对象和组合对象,从而简化了客户端代码;
- 组合模式使得可以很自然地将对象和它们的行为组织在一起,提高了代码的内聚性;
- 新增加的叶节点类型或树枝节点类型可以无缝集成到现有系统中,无需修改现有代码;
- 组合模式使得对象的添加和删除变得容易,因为它们可以统一地被添加到树形结构中。
缺点
- 客户端需要花更更多时间理理清类之间的层次关系;
- 组合模式要求所有叶子节点和树枝节点都实现相同的接口,这可能限制了对象的灵活性。
5.使用场景
- 当想表达对象的部分-整体的层次结构,比如公司结构、菜单、文件夹等等;
- 当我们的要处理的对象可以生成一颗树形结构,我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子。
总结
以上就是本篇的内容,本文简单介绍了组合模式的组成、优缺点、使用场景等,提供了代码示例。