
package com.eric.结构型模式.组合模式;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 抽象构件接口
 * @CreateTime 2020-11-30 18:46:56
 */
public interface Component {
    public void operation();
}package com.eric.结构型模式.组合模式;
import java.util.ArrayList;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 树枝构件
 * @CreateTime 2020-11-30 18:47:54
 */
public class Composite implements Component{
    //构件容器
    private ArrayList<Component> componentList = new ArrayList<Component>();
    //添加构件
    public void add(Component component){
        this.componentList.add(component);
    }
    //删除构件
    public void remove(Component component){
        this.componentList.remove(component);
    }
    //获取子构件
    public ArrayList<Component> getChild(){
        return this.componentList;
    }
    @Override
    public void operation() {
        //业务逻辑代码
        System.out.println("树枝执行自己的业务中...");
    }
}package com.eric.结构型模式.组合模式;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 叶子构件
 * @CreateTime 2020-11-30 18:52:19
 */
public class Leaf implements Component {
    @Override
    public void operation() {
        //业务逻辑代码
        System.out.println("叶子执行自己的业务中...");
    }
}package com.eric.结构型模式.组合模式;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 测试类
 * @CreateTime 2020-11-30 18:53:01
 */
public class Client {
    public static void main(String[] args) {
        //创建一个根节点
        Composite root = new Composite();
        root.operation();
        //创建树枝结点
        Composite branch = new Composite();
        //创建叶子结点
        Leaf leaf = new Leaf();
        //构件树形结构
        root.add(branch);
        branch.add(leaf);
        dispaly(root);
    }
    //遍历树(递归)
    public static void dispaly(Composite root){
        for (Component component : root.getChild()) {
            //如果是叶子结点
            if(component instanceof Leaf){
                component.operation();
            }else {
                //树枝节点继续遍历
                component.operation();
                //递归调用
                dispaly((Composite) component);
            }
        }
    }
}
package com.eric.结构型模式.组合模式.例1;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 抽象接口Company
 * @CreateTime 2020-11-30 19:40:06
 */
public interface Company {
    //获取信息
    public String getInfo();
}package com.eric.结构型模式.组合模式.例1;
 import java.util.ArrayList;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 树枝节点类
 * @CreateTime 2020-11-30 19:41:17
 */
public class ConcreteCompany implements Company {
    private ArrayList<Company> companyList = new ArrayList<Company>();
    private String name;//姓名
    private String position;//职位
    private int salary;//薪水
    //构造函数
    public ConcreteCompany(String name,String position,int salary){
        this.name = name;
        this.position = position;
        this.salary = salary;
    }
    //添加
    public void add(Company company){
        this.companyList.add(company);
    }
    //删除
    public void remove(Company company){
        this.companyList.remove(company);
    }
    //获得所有子构件
    public ArrayList<Company> getChild(){
        return this.companyList;
    }
    @Override
    public String getInfo() {
        String info = "";
        info = "名称:" + this.name;
        info = info + "\t职位:" + this.position;
        info = info + "\t薪水:" + this.salary;
        return info;
    }
}package com.eric.结构型模式.组合模式.例1;
import java.util.ArrayList;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 叶子结点类
 * @CreateTime 2020-11-30 19:51:03
 */
public class Employee implements Company {
    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 String getInfo() {
        String info = "";
        info = "名称:" + this.name;
        info = info + "\t职位:" + this.position;
        info = info + "\t薪水:" + this.salary;
        return info;
    }
}package com.eric.结构型模式.组合模式.例1;
/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 应用代码
 * @CreateTime 2020-11-30 19:53:18
 */
public class ClientDemo {
    public static void main(String[] args) {
        //CEO
        ConcreteCompany root = new ConcreteCompany("Eric", "CEO", 100000000);
        //部门经理
        ConcreteCompany developDep = new ConcreteCompany("Error", "研发部经理", 700000);
        ConcreteCompany saleDep = new ConcreteCompany("Erock", "销售部经理", 400000);
        ConcreteCompany financeDep = new ConcreteCompany("zzzz", "财务部经理", 400000);
        //部门员工
        Employee e1 = new Employee("路人1", "研发部", 90000);
        Employee e2 = new Employee("路人2", "研发部", 90000);
        Employee e3 = new Employee("路人3", "研发部", 90000);
        Employee e4 = new Employee("路人4", "研发部", 90000);
        Employee e5 = new Employee("路人5", "研发部", 90000);
        Employee e6 = new Employee("路人6", "研发部", 90000);
        Employee e7 = new Employee("路人7", "销售部", 90000);
        Employee e8 = new Employee("路人8", "销售部", 90000);
        Employee e9 = new Employee("路人9", "财务部", 90000);
        //生成树
        root.add(developDep);
        root.add(saleDep);
        root.add(financeDep);
        developDep.add(e1);
        developDep.add(e2);
        developDep.add(e3);
        developDep.add(e4);
        developDep.add(e5);
        developDep.add(e6);
        saleDep.add(e7);
        saleDep.add(e8);
        financeDep.add(e9);
        //显示公司层次
        System.out.println(root.getInfo());
        dispaly(root);
    }
    //遍历树
    public static void dispaly(ConcreteCompany root){
        for (Company company : root.getChild()) {
            if(company instanceof Employee){
                System.out.println(company.getInfo());
            }else{
                System.out.println("\n"+company.getInfo());
                dispaly((ConcreteCompany)company);
            }
        }
    }
}
原文:https://www.cnblogs.com/zyl-0110/p/14204676.html