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 [email protected]
*/
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 [email protected]
*/
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 [email protected]
*/
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 [email protected]
*/
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 [email protected]
*/
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);
}
});
}
}
优势
组合模式适用于描述整体与部分之间的关系场景,对于上述的公司结构、文件夹结构等树形结构较有效,但是容易结构混乱,仅适用于结构简单的结构。