您现在的位置是:首页 >学无止境 >设计模式之组合模式网站首页学无止境
设计模式之组合模式
简介设计模式之组合模式
组合模式(Composite Pattern)是一种结构型设计模式,通过让个别对象和组合对象实现同一个接口,使得客户端可以统一处理单个对象和组合对象。
组合模式可以用来解决树形结构中的问题,将对象组合成树形结构以表示“部分-整体”的层次结构。它让客户端忽略简单元素和复杂元素的差异,统一的使用组合结构中的所有元素。
组合模式主要包含以下角色:
- Component:组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个与子部件有关的接口。
- Leaf:在组合结构中表示叶节点对象,叶节点没有子节点。 它实现与树枝节点共享的接口,但不再包含除实现自己功能外,其他方法。
- Composite:定义有枝节点的行为,用来存储子部件,在适当情况下传递请求给它们。实现与叶节点共享的接口,包含当前节点的子节点。
- 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
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。