组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
类图示例

举个例子
公司管理系统
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| import java.util.ArrayList; import java.util.List;
abstract class Company{ protected String name; public Company(String name){ this.name = name; } public abstract void Add(Company c); public abstract void Remove(Company c); public abstract void Display(int depth); public abstract void LineOfDuty(); }
class ConcreteCompany extends Company{ private List<Company> children = new ArrayList<>(); public ConcreteCompany(String name){ super(name); } public void Add(Company c){ children.add(c); } public void Remove(Company c){ children.remove(c); } public void Display(int depth){ System.out.println("-".repeat(depth)+name); for(Company c : children){ c.Display(depth+2); } } public void LineOfDuty(){ for(Company c : children){ c.LineOfDuty(); } } }
class HRDepartment extends Company{ public HRDepartment(String name){ super(name); } public void Add(Company c){
} public void Remove(Company c){
} public void Display(int depth){ System.out.println("-".repeat(depth)+name); } public void LineOfDuty(){ System.out.println(name+"员工招聘培训管理"); } }
class FinancialDepartment extends Company{ public FinancialDepartment(String name){ super(name); } public void Add(Company c){
} public void Remove(Company c){
} public void Display(int depth){ System.out.println("-".repeat(depth)+name); } public void LineOfDuty(){ System.out.println(name+"公司财务收支管理"); } }
public class Composite { public static void main(String[] args) { ConcreteCompany root=new ConcreteCompany("北京总公司"); root.Add(new HRDepartment("北京总公司人力资源部")); root.Add(new FinancialDepartment("北京总公司财务部")); ConcreteCompany company1=new ConcreteCompany("上海分公司"); company1.Add(new HRDepartment("上海分公司人力资源部")); company1.Add(new FinancialDepartment("上海分公司人力资源部")); root.Add(company1); ConcreteCompany company2=new ConcreteCompany("深圳分公司"); company2.Add(new HRDepartment("深圳分公司人力资源部")); company2.Add(new FinancialDepartment("深圳分公司人力资源部")); root.Add(company2); root.Display(1); root.LineOfDuty(); } }
|
类图

组合模式包含如下角色
- Component接口:定义了所有对象必须实现的操作。
- Leaf类:实现Component接口,代表树中的叶子节点。
- Composite类:也实现Component接口,并包含其他Component对象的集合。
模式分析
- 优点
- 简化客户端代码:客户端可以统一处理所有类型的节点。
- 易于扩展:可以轻松添加新的叶子类型或树枝类型。
- 缺点
- 违反依赖倒置原则:组件的声明是基于具体类而不是接口,这可能导致代码的灵活性降低。