一、前言
本篇主题为结构型模式中的第四个模式–组合模式。上篇 Java 设计模式主题为《Java 设计模式之装饰模式(八)》。
二、简单介绍
# 2.1 定义
组合模式(Composite)是结构型的设计模式之一。通过递归手段来构造树形的对象结构以表示“部分-整体”的层次结构,并可以通过一个对象来访问整个对象树。
组合模式使得用户对单个对象和组合对象的使用具有一致性。
# 2.2 参与角色
-
Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。
-
Leaf:在组合中表示子部件,定义子部件对象的行为,该部件没有子部件。
-
Composite:实现 Component 接口中与子部件有关的操作。
# 2.3 应用场景
-
需求中体现对象的部分-整体层次结构。
-
希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
三、实现方式
我们以公司项目组的员工为例。
项目组由员工组成,员工角色分为项目负责人和开发人员。开发项目需要招聘开发人员,由项目负责人决定开发人员去留和管理手下,此时每个员工都是一个个体(部分)。当老板需要了解项目进度时,通常只需要让项目负责人(员工)汇报情况即可,这时员工可以看作一个整体。
抽象类(Component):可以看作公司发布的招聘岗位
- public abstract class Employee {
-
- protected List<Employee> employeeList;
-
- public abstract void add(Employee employee);
-
- public abstract void delete(Employee employee);
-
- public abstract void report();
- }
项目组/部门负责人(Composite):可以作为整体具备向老板汇报手下所有人的工作情况的义务。
- public class ProjectManager extends Employee {
-
- private String name;
-
- public ProjectManager(String name) {
- this.name = name;
- this.employeeList = new ArrayList<Employee>();
- }
-
- @Override
- public void add(Employee employee) {
- this.employeeList.add(employee);
- }
-
- @Override
- public void delete(Employee employee) {
- this.employeeList.remove(employee);
- }
-
- @Override
- public void report() {
- System.out.println(this.name + "汇报项目组员工的任务进度");
- for (Employee employee : employeeList) {
- employee.report();
- }
- }
- }
程序员(Leaf):项目组/部门的组成部分
- public class Programmer extends Employee {
-
- private String name;
-
- public Programmer(String name) {
- this.name = name;
- }
-
- @Override
- public void add(Employee employee) {
-
- }
-
- @Override
- public void delete(Employee employee) {
-
- }
-
- @Override
- public void report() {
- Random r = new Random();
- String temp = String.format("%.2f", r.nextFloat() * 100);
- System.out.println(this.name + "任务进度为" + temp + "%");
- }
-
- }
客户端:
- public class Client {
-
- public static void main(String[] args) {
-
- Employee p1 = new Programmer("小白");
- Employee p2 = new Programmer("小黑");
-
- Employee projectManager = new ProjectManager("老阎");
- projectManager.add(p1);
- projectManager.add(p2);
-
- projectManager.report();
- }
- }
打印:
- 老阎汇报项目组员工的任务进度
- 小白任务进度为92.65%
- 小黑任务进度为43.30%
UML 类图表示如下:
评论