Java组合设计模式
定义
组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式依据树状结构来组合对象,用来表示部分以及整体层次。这种设计模式属于结构性模式。组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。
对应角色
- 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。
- 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
- 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add ()、Remove ()、GetChild () 等方法
优缺点
优点
- 定义层次:清楚地定义分层次的复杂对象,表示对象的全部或部分层次。
- 忽略层次:让客户端忽略层次之间的差异,方便对整个层次结构进行控制。
- 简化客户端代码。
- 符合开闭原则。
缺点
- 限制类型复杂:限制类型时,比较复杂。如:某个目录中只能包含文本文件,使用组合模式时,不能依赖类型系统,施加约束,它们都来自于节点的抽象层。在这种情况下,必须通过在运行时进行类型检查,这样就变得比较复杂。
- 使设计变得更加抽象¹。
应用场景
组合模式适用于处理树形结构的场景,例如文件系统,根目录下有若干文件和目录,在二级目录下还有目录和文件。这种情况下,适合使用组合模式。组合模式使客户端对单个对象和组合对象保持一致的方式处理¹²。文章来源:https://www.toymoban.com/news/detail-558212.html
组合模式在用户界面中也有广泛的应用,例如在窗口、菜单、按钮等UI组件中都可以使用组合模式来设计。在这些场景中,组合模式可以很好地管理组件的层级关系,并且可以方便地对整个界面进行布局和维护文章来源地址https://www.toymoban.com/news/detail-558212.html
实例
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组合设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!