JAVA设计模式——(二)组合模式

JAVA设计模式------(二)组合模式

原理

组合模式用于描述对象在"整体-部分"中的关系,用户对单个对象和组合对象的使用具有一致性。

组合模式中由于单个对象和组合对象的使用具有一致性,所以需要定义组合对象中共有方法和属性,规范行为的接口。

解释

在组合模式中,整体与部分的关系,可以看成树形结构,一棵大树,有主干,有叶子。但是都是属于树的一部分,只不过叶子是附着在不同的枝干上面,枝杈又在主干上面。所以通过这种形式,便可以很快的构建出树状形式的结构。

最常见的例子,便是公司的结构。公司中有部门和员工,部门构成分支,员工是每个分支的节点,且部分隶属于公司。所以公司的结构信息是典型的组合模式。

实现

定义规范接口

规范接口用于统一各部分的行为。

java 复制代码
package cn.sh.designepattern;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/22 14:48
 * @Contact 643947568@qq.com
 */
public interface Company {

    public void addComponent(Company company);

    public void removeComponent(Company company);

    public void getInfo();

    public List<Company> getComponents();
}

定义主干

java 复制代码
package cn.sh.designepattern;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/22 15:02
 * @Contact 643947568@qq.com
 */
public class ActualCompany implements Company{

    private final List<Company> companies = new ArrayList<>();

    private String name;

    private String position;

    private int salary;

    public ActualCompany(String name, String position, int salary) {
        this.salary = salary;
        this.position = position;
        this.name = name;
    }

    @Override
    public void addComponent(Company company) {
        companies.add(company);
    }

    @Override
    public void removeComponent(Company company) {
        companies.remove(company);
    }

    @Override
    public void getInfo() {
        System.out.println(this);
    }

    @Override
    public List<Company> getComponents() {
        return companies;
    }

    @Override
    public String toString() {
        return "Department{" +
                "companies=" + companies +
                ", name='" + name + '\'' +
                ", position='" + position + '\'' +
                ", salary='" + salary + '\'' +
                '}';
    }
}

定义分支

java 复制代码
package cn.sh.designepattern;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/22 14:51
 * @Contact 643947568@qq.com
 */
public class Department implements Company {

    private final List<Company> companies = new ArrayList<>();

    private String name;

    private String position;

    private int salary;

    public Department(String name, String position, int salary) {
        this.salary = salary;
        this.position = position;
        this.name = name;
    }

    @Override
    public void addComponent(Company company) {
        companies.add(company);
    }

    @Override
    public void removeComponent(Company company) {
        companies.remove(company);
    }

    @Override
    public void getInfo() {
        System.out.println(this);
    }

    @Override
    public List<Company> getComponents() {
        return companies;
    }

    @Override
    public String toString() {
        return "Department{" +
                "companies=" + companies +
                ", name='" + name + '\'' +
                ", position='" + position + '\'' +
                ", salary='" + salary + '\'' +
                '}';
    }
}

定义叶子

java 复制代码
package cn.sh.designepattern;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/22 14:55
 * @Contact 643947568@qq.com
 */
public class Employee implements Company {
    private final List<Company> companies = new ArrayList<>();

    private String name;

    private String position;

    private int salary;

    public Employee(String name, String position, int salary) {
        this.name = name;
        this.position = position;
        this.salary = salary;
    }

    @Override
    public void addComponent(Company company) {
        companies.add(company);
    }

    @Override
    public void removeComponent(Company company) {
        companies.remove(company);
    }

    @Override
    public void getInfo() {
        System.out.println(this);
    }

    @Override
    public List<Company> getComponents() {
        return companies;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "companies=" + companies +
                ", name='" + name + '\'' +
                ", position='" + position + '\'' +
                ", salary='" + salary + '\'' +
                '}';
    }
}

测试代码

java 复制代码
package cn.sh.designepattern;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/21 21:33
 * @Contact 643947568@qq.com
 */

public class Main {
    public static void main(String[] args) {
        Company developDept = new Department("张三", "开发部主管", 10000);
        Company financeDept = new Department("张三", "财务部主管", 20000);
        Company saleDept = new Department("张三", "销售部主管", 30000);

        Company develop1 = new Employee("A", "开发部员工", 500);
        Company develop2 = new Employee("B", "开发部员工", 600);
        Company develop3 = new Employee("C", "开发部员工", 700);


        Company finance1 = new Employee("D", "财务部员工", 200);
        Company finance2 = new Employee("E", "财务部员工", 6500);
        Company finance3 = new Employee("F", "财务部员工", 700);


        Company sale1 = new Employee("G", "销售部员工", 1500);
        Company sale2 = new Employee("H", "销售部员工", 4600);
        Company sale3 = new Employee("I", "销售部员工", 5700);

        Company actualCompany = new ActualCompany("公司", "公司", 0);
        actualCompany.addComponent(developDept);
        actualCompany.addComponent(financeDept);
        actualCompany.addComponent(saleDept);

        developDept.addComponent(develop1);
        developDept.addComponent(develop2);
        developDept.addComponent(develop3);

        financeDept.addComponent(finance1);
        financeDept.addComponent(finance2);
        financeDept.addComponent(finance3);

        saleDept.addComponent(sale1);
        saleDept.addComponent(sale2);
        saleDept.addComponent(sale3);

        displayCompanyInfo(actualCompany);

    }

    private static void displayCompanyInfo(Company actualCompany) {
        actualCompany.getComponents().forEach(company -> {
            if (company instanceof Employee){
               company.getInfo();
            }else {
                company.getInfo();
                displayCompanyInfo(company);
            }
        });

    }
}

优势

组合模式适用于描述整体与部分之间的关系场景,对于上述的公司结构、文件夹结构等树形结构较有效,但是容易结构混乱,仅适用于结构简单的结构。

相关推荐
十年Java程序媛1 分钟前
Redis 分布式锁 + GZIP 压缩缓存踩坑|高并发缓存真实线上复盘
java·开发语言·spring boot·redis·分布式·缓存·面试
4SAPI31 分钟前
Provider Adapter设计模式:如何让AI应用支持多个模型
网络·人工智能·设计模式
顽疲33 分钟前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
共饮一杯无39 分钟前
LiveKit本地录制落盘路径排查与修复实践
java·go·livekit
StevenLdh1 小时前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务消费者
java·dubbo·交友
IT研究室1 小时前
最新计算机毕业设计选题推荐-基于spring boot的教育学习平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
亚林瓜子1 小时前
Spring Boot 集成 ip2region 离线 IP 库实战指南
java·spring boot·后端·ip·ip2region
盛世宏博智慧档案2 小时前
恒湿净化一体机联动开发:档案馆温湿度阈值判断与启停控制实践
java·后端·struts·恒湿机·加湿除湿消毒净化一体机
vipxieliang2 小时前
ValidX 应用于 HR系统员工信息验证:入职、离职、社保数据
java·spring boot·后端