您现在的位置是:首页 >学无止境 >设计模式之组合模式网站首页学无止境

设计模式之组合模式

静心观复 2023-05-25 16:00:02
简介设计模式之组合模式

组合模式(Composite Pattern)是一种结构型设计模式,通过让个别对象和组合对象实现同一个接口,使得客户端可以统一处理单个对象和组合对象。
组合模式可以用来解决树形结构中的问题,将对象组合成树形结构以表示“部分-整体”的层次结构。它让客户端忽略简单元素和复杂元素的差异,统一的使用组合结构中的所有元素。
组合模式主要包含以下角色:

  1. Component:组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个与子部件有关的接口。
  2. Leaf:在组合结构中表示叶节点对象,叶节点没有子节点。 它实现与树枝节点共享的接口,但不再包含除实现自己功能外,其他方法。
  3. Composite:定义有枝节点的行为,用来存储子部件,在适当情况下传递请求给它们。实现与叶节点共享的接口,包含当前节点的子节点。
  4. Client:通过 Component 接口操作组合结构中的对象。
    举个简单例子,我们可以用组合模式来表示一个公司的组织结构:
  • Component 定义了员工的共同接口
  • Leaf 表示普通员工
  • Composite 表示部门经理,并包含子部门和普通员工
  • Client 可以统一通过 Component 接口处理普通员工和部门经理
    组合模式的主要优点是可以清晰地表示树形结构,并且客户端可以一致地处理简单和复杂元素。如果您对组合模式还有更深入的疑问,可以随时提出。

这里给出组合模式的Java代码示例:
员工接口:

public interface Employee {
    void add(Employee employee);
    void remove(Employee employee);
    double getSalary();
    void print();
}

普通员工类:

public class CommonEmployee implements Employee {
    private double salary;
    
    public CommonEmployee(double salary) {
        this.salary = salary;
    }
    
    @Override
    public void add(Employee employee) {
        // do nothing
    }

    @Override
    public void remove(Employee employee) {
        // do nothing
    }

    @Override
    public double getSalary() {
        return salary; 
    }

    @Override
    public void print() { 
        System.out.println("普通员工,薪水:" + salary); 
    }
}

部门经理类:

public class DepartmentManager implements Employee {
    private double salary; 
    private List<Employee> subordinates = new ArrayList<>();
    
    public DepartmentManager(double salary) {
        this.salary = salary;
    }
    
    @Override
    public void add(Employee employee) {
        subordinates.add(employee);
    }

    @Override
    public void remove(Employee employee) {
        subordinates.remove(employee);
    }

    @Override
    public double getSalary() {
        double totalSalary = 0;
        for (Employee e : subordinates) {
            totalSalary += e.getSalary();
        }
        return totalSalary + salary; 
    }

    @Override
    public void print() {
        System.out.println("部门经理,薪水:" + getSalary());
        for (Employee e : subordinates) {
            e.print(); 
        }
    }
} 

测试代码:

public class Test {
    public static void main(String[] args) {
        Employee CEO = new DepartmentManager(100000);
        
        Employee depart1 = new DepartmentManager(50000);
        depart1.add(new CommonEmployee(30000));
        depart1.add(new CommonEmployee(20000));
        CEO.add(depart1);
        
        Employee depart2 = new DepartmentManager(40000); 
        CEO.add(depart2);
        
        CEO.print();
    }
}

输出:
部门经理,薪水:150000.0
普通员工,薪水:30000.0
普通员工,薪水:20000.0
部门经理,薪水:40000.0

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。