Java组合设计模式

Java组合设计模式

定义

组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式依据树状结构来组合对象,用来表示部分以及整体层次。这种设计模式属于结构性模式。组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。

对应角色

  • 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。
  • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
  • 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add ()、Remove ()、GetChild () 等方法

优缺点

优点

  • 定义层次:清楚地定义分层次的复杂对象,表示对象的全部或部分层次。
  • 忽略层次:让客户端忽略层次之间的差异,方便对整个层次结构进行控制。
  • 简化客户端代码。
  • 符合开闭原则。

缺点

  • 限制类型复杂:限制类型时,比较复杂。如:某个目录中只能包含文本文件,使用组合模式时,不能依赖类型系统,施加约束,它们都来自于节点的抽象层。在这种情况下,必须通过在运行时进行类型检查,这样就变得比较复杂。
  • 使设计变得更加抽象¹。

应用场景

组合模式适用于处理树形结构的场景,例如文件系统,根目录下有若干文件和目录,在二级目录下还有目录和文件。这种情况下,适合使用组合模式。组合模式使客户端对单个对象和组合对象保持一致的方式处理¹²。

组合模式在用户界面中也有广泛的应用,例如在窗口、菜单、按钮等UI组件中都可以使用组合模式来设计。在这些场景中,组合模式可以很好地管理组件的层级关系,并且可以方便地对整个界面进行布局和维护

实例

import java.util.ArrayList;
import java.util.List;
 
public class Employee {
   private String name;
   private String dept;
   private int salary;
   private List<Employee> subordinates;
 
   //构造函数
   public Employee(String name,String dept, int sal) {
      this.name = name;
      this.dept = dept;
      this.salary = sal;
      subordinates = new ArrayList<Employee>();
   }
 
   public void add(Employee e) {
      subordinates.add(e);
   }
 
   public void remove(Employee e) {
      subordinates.remove(e);
   }
 
   public List<Employee> getSubordinates(){
     return subordinates;
   }
 
   public String toString(){
      return ("Employee :[ Name : "+ name 
      +", dept : "+ dept + ", salary :"
      + salary+" ]");
   }   
}
public class CompositePatternDemo {
   public static void main(String[] args) {
      Employee CEO = new Employee("John","CEO", 30000);
 
      Employee headSales = new Employee("Robert","Head Sales", 20000);
 
      Employee headMarketing = new Employee("Michel","Head Marketing", 20000);
 
      Employee clerk1 = new Employee("Laura","Marketing", 10000);
      Employee clerk2 = new Employee("Bob","Marketing", 10000);
 
      Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
      Employee salesExecutive2 = new Employee("Rob","Sales", 10000);
 
      CEO.add(headSales);
      CEO.add(headMarketing);
 
      headSales.add(salesExecutive1);
      headSales.add(salesExecutive2);
 
      headMarketing.add(clerk1);
      headMarketing.add(clerk2);
 
      //打印该组织的所有员工
      System.out.println(CEO); 
      for (Employee headEmployee : CEO.getSubordinates()) {
         System.out.println(headEmployee);
         for (Employee employee : headEmployee.getSubordinates()) {
            System.out.println(employee);
         }
      }        
   }
}

你可能感兴趣的:(设计模式系列,java,设计模式)