java设计模式(十一)组合模式(Composite Pattern)

1、模式介绍:

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

2、应用场景:

表示树形结构:当你需要表示对象的部分-整体层次结构时,例如文件系统中的文件和目录,图形界面中的 UI 组件,公司组织结构中的部门与员工等。
统一处理:希望客户端能够统一处理单个对象和组合对象时,可以使用组合模式。这样客户端不需要关心处理的是单个对象还是组合对象。

3、优点:

简化客户端代码:客户端可以一致地对待单个对象和组合对象,无需区分它们的具体类型。
灵活性:可以在运行时动态地增加或移除子对象,更容易扩展。
层次结构:可以更好地表示对象的层次结构,方便递归遍历和操作。

4、缺点:

限制类型:可能限制组合中的组件类型,因为组件必须实现统一的接口或继承自统一的类。
复杂性:可能会使设计更加抽象复杂,特别是在处理深层次的递归结构时。

5、代码实现:

/**
 * 抽象组件接口
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public interface Department {
    void printDepartmentName();
}

/**
 * 子节点:具体部门
 *
 * @author FM_南风
 * @date 2024/7/3 13:55
 */
public class ConcreteDepartment implements Department{
    private String name;

    public ConcreteDepartment(String name) {
        this.name = name;
    }

    @Override
    public void printDepartmentName() {
        System.out.println("Department: " + name);
    }
}

/**
 * 子节点:组合部门
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class CompositeDepartment implements Department{
    private String name;
    private List<Department> departments = new ArrayList<>();

    public CompositeDepartment(String name) {
        this.name = name;
    }

    public void addDepartment(Department department) {
        departments.add(department);
    }

    public void removeDepartment(Department department) {
        departments.remove(department);
    }

    @Override
    public void printDepartmentName() {
        System.out.println("Department: " + name);
        for (Department department : departments) {
            department.printDepartmentName();
        }
    }
}

/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class CompositeClient {
    public static void main(String[] args) {
        ConcreteDepartment salesDepartment = new ConcreteDepartment("A");
        ConcreteDepartment marketingDepartment = new ConcreteDepartment("B");

        CompositeDepartment headDepartment = new CompositeDepartment("C");
        headDepartment.addDepartment(salesDepartment);
        headDepartment.addDepartment(marketingDepartment);

        ConcreteDepartment financeDepartment = new ConcreteDepartment("D");
        headDepartment.addDepartment(financeDepartment);

        headDepartment.printDepartmentName();
    }
}


6、结果展示:

示例说明:

在上面的示例中,Department 是抽象组件类,定义了统一的接口 printDepartmentName()ConcreteDepartment 是叶子节点类,表示具体的部门。CompositeDepartment 是容器节点类,表示组合的部门,可以包含其他部门(包括叶子部门和容器部门)。客户端通过操作抽象组件 Department 来构建和操作部门与员工的层次结构。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值