程序员必备技能:设计模式之——组合模式

什么是组合模式“组合模式”也被称为“部分整体模式”该模式属于结构型模式的一种 。
讲解该模式之前先带大家熟悉一下“树形结构” 。相信大家对“树形结构”不会太陌生,如果你刚好不太了解的话可以想一下大树,一颗树它分别有树根、树枝、树叶,正好树形结构中也有根节点、子节点(非叶子节点)、叶子节点 。

程序员必备技能:设计模式之——组合模式

文章插图
 
组合模式就运用了树形结构,该模式的核心思想是:将多个对象组合成树形结构,以此结构来表示“整体-部分”之间的层次关系 。
组合模式UML类图 
程序员必备技能:设计模式之——组合模式

文章插图
 
UML类图讲解:
1、Component:组合模式中的“根节点”,可以是接口、抽象类、普通类,该类中定义了其子类的所有共性内容,并且该类中还存在着用于访问和管理它子部件的方法 。
2、Leaf:组合中的叶子节点,也就是最末端的节点,该节点下不会再有子节点 。
3、Composite:非叶子节点,它的作用是存储子部件,并且在Composite中实现了对子部件的相关操作 。
通过案例了解组合模式案例:某公司老板需要开发一个人员和部门管理系统,要求是可以灵活的新增、删除、展示部门以及部门下的员工 。此时我们就可以通过组合模式来实现 。
组织构成 => 对应Component角色
public abstract class OrganizationComponent {// 名称private String name;// 描述private String describe;/*** 显示方法* 该方法不论是子节点还是叶子节点都需要,所以将其设计成抽象方法让子类自行实现 。*/public abstract void show();/*** 新增方法* 因为叶子节点不需要该方法,所以将该方法写成一个空实现方法,这样叶子节点继承该类时就不会被迫实现不需要的方法了 。*/public void add(OrganizationComponent component) {throw new UnsupportedOperationException();}/*** 删除方法* 同add()方法一样设计为空实现 。*/public void remove(OrganizationComponent component) {throw new UnsupportedOperationException();} ... get()、set()、有参构造方法}公司 => 对应Composite角色
public class Company extends OrganizationComponent {// components的作用就是,管理公司下的部门,也就是公司下的子节点 。private List<OrganizationComponent> components = new ArrayList<>();... 有参构造方法/*** 重写添加方法*/@Overridepublic void add(OrganizationComponent component) {this.components.add(component);}/*** 重写删除方法*/@Overridepublic void remove(OrganizationComponent component) {this.components.remove(component);}/*** 实现显示方法*/@Overridepublic void show() {// 打印公司名称System.out.println("======" + "名称:" + this.getName() + " 描述:" + this.getDescribe() + "======");// 打印公司下的子节点for (OrganizationComponent component : components) {component.show();}}}部门 => 对应Composite角色
public class Department extends OrganizationComponent {// components的作用就是,管理部门下的员工,也就是部门下的子节点 。private List<OrganizationComponent> components = new ArrayList<>();... 有参构造方法/*** 重写添加方法*/@Overridepublic void add(OrganizationComponent component) {this.components.add(component);}/*** 重写删除方法*/@Overridepublic void remove(OrganizationComponent component) {this.components.remove(component);}/*** 实现显示方法*/@Overridepublic void show() {// 打印部门名称System.out.println("======" + "名称:" + this.getName() + " 描述:" + this.getDescribe() + "======");// 打印部门下的子节点for (OrganizationComponent component : components) {component.show();}}}员工 => 对应的是Leaf角色
public class Workers extends OrganizationComponent {... 有参构造方法/*** 实现显示方法*/@Overridepublic void show() {System.out.println("名称:" + this.getName() + " 描述:" + this.getDescribe());}}客户端测试类
public class Client {public static void main(String[] args) {// 公司OrganizationComponent company = new Company("小菜鸟公司", "从不加加班的公司");// 部门OrganizationComponent department = new Department("研发部", "一个神奇的部门");// 公司下添加部门company.add(department);// 员工department.add(new Workers("大牛", "上班摸摸鱼"));department.add(new Workers("小菜鸟一号", "天天CRUD"));// 输出company.show();}}


推荐阅读