努力才会收获成功,不努力只能永远羡慕别人。
一、组合模式简介
组合模式是设计模式中结构型模式的一种。它表示了一种将相似对象组合成树状结构的“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、组合模式的作用
组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。
- 统一元素与部分整体,简化处理代码。
- 将元素内部结构同处理程序解耦,从而一致的对待元素与部分整体。
三、组合模式的应用
- 在对象与部分整体之间,想要通过统一的方式对其进行处理,模糊处理其差异的时候可以选用组合模式。
- 当客户端忽视结构层次,无差异的看待元素与部分整体,不关心元素和部分整体之间的层次结构,想要实现对统一接口编程的时候。
- 对象组合的变化是动态的,而客户端想要一致的处理对象的时候。
例:文件系统、企业结构都是组合模式的典型应用。
四、示例演示组合模式
结构图
代码示例
Dept(部门抽象类)
import java.util.ArrayList;
import java.util.List;
/**
* 部门抽象类
*
* @author ZhengNC
* @date 2020/9/2 19:36
*/
public abstract class Dept {
private List<Dept> deptList = new ArrayList<>();
/**
* 添加子部门
*
* @param dept
*/
public void addDept(Dept dept){
deptList.add(dept);
}
/**
* 移除子部门
*
* @param dept
*/
public void removeDept(Dept dept){
deptList.remove(dept);
}
/**
* 获取所有子部门
*
* @return
*/
public List<Dept> getDeptList(){
return deptList;
}
/**
* 打印部门名称
*/
public abstract void printName();
}
Company(公司)
/**
* 公司
*
* @author ZhengNC
* @date 2020/9/2 19:42
*/
public class Company extends Dept {
@Override
public void printName() {
System.out.println("公司");
}
}
HumanResourcesDept(人力资源部)
/**
* 人力资源部
*
* @author ZhengNC
* @date 2020/9/2 19:44
*/
public class HumanResourcesDept extends Dept {
@Override
public void printName() {
System.out.println("人力资源部");
}
}
MarketingDept(营销事业部)
/**
* 营销事业部
*
* @author ZhengNC
* @date 2020/9/2 19:46
*/
public class MarketingDept extends Dept {
@Override
public void printName() {
System.out.println("营销事业部");
}
}
OperationManagementDept(运营管理部)
/**
* 运营管理部
*
* @author ZhengNC
* @date 2020/9/2 19:49
*/
public class OperationManagementDept extends Dept {
@Override
public void printName() {
System.out.println("运营管理部");
}
}
MarketingOperationDept(营销运维部)
/**
* 营销运维部
*
* @author ZhengNC
* @date 2020/9/2 19:55
*/
public class MarketingOperationDept extends Dept {
@Override
public void printName() {
System.out.println("营销运维部");
}
}
BusinessSupportDept(业务支持部)
/**
* 业务支持部
*
* @author ZhengNC
* @date 2020/9/2 19:57
*/
public class BusinessSupportDept extends Dept {
@Override
public void printName() {
System.out.println("业务支持部");
}
}
MarketDept(营销市场部)
/**
* 营销市场部
*
* @author ZhengNC
* @date 2020/9/2 20:00
*/
public class MarketDept extends Dept {
@Override
public void printName() {
System.out.println("营销市场部");
}
}
测试代码
/**
* 测试组合模式
*
* @author ZhengNC
* @date 2020/9/2 20:01
*/
public class TestComposite {
public static void main(String[] args) {
Dept company = new Company();
company.addDept(new HumanResourcesDept());
Dept marketingDept = new MarketingDept();
company.addDept(marketingDept);
company.addDept(new OperationManagementDept());
marketingDept.addDept(new MarketingOperationDept());
marketingDept.addDept(new BusinessSupportDept());
marketingDept.addDept(new MarketDept());
printDept(company, 0);
}
public static void printDept(Dept dept, int level){
if (dept != null){
for (int i = 0; i < level; i++){
System.out.print("\t");
}
dept.printName();
if (dept.getDeptList() != null){
int finalLevel = level + 1;
dept.getDeptList().forEach(x -> printDept(x, finalLevel));
}
}
}
}
输出结果:
公司
人力资源部
营销事业部
营销运维部
业务支持部
营销市场部
运营管理部