【程序员】看了这篇你将彻底了解组合模式


【程序员】看了这篇你将彻底了解组合模式
本文插图
作者 | 静幽水
责编 | 郭芮
【程序员】看了这篇你将彻底了解组合模式
本文插图
问题背景
假设 , IT公司老板通过观察者模式和程序员小强和小华实现了通信 , 便于通知他们加班 , 还可以单独通知不同的内容 , 例如通知小强加班 , 通知小华去出差 。 但随着公司的规模慢慢变大 , 公司从只有两个程序员和一个秘书的公司成长为一个拥有研发部和市场部两个部门 , 十几位员工的公司 。 那这种情况下 , 之前的通知系统还好用吗?例如老板想要通知研发部经理和市场部经理来办公室开会 , 并且通知研发部经理手下的所有研发人员今晚加班赶项目进度 , 该如何实现呢?
首先 , 将公司里所有的人员抽象出一个Staff接口类 , 接口里是所有成员的共同属性和方法 , 如获取个人信息的方法和接收通知的方法 。
Staff接口类
public interface Staff { //获取个人信息 public String getInfo; //接收通知 public void doSomething(String notice);} 然后公司里的员工可以分为两类 , 一类是管理者 , 手下还有若干管理者或员工 , 另一类就是普通的员工 , 没有下属 。 首先定义管理者的接口:
import java.util.ArrayList;//管理者接口public interface IManager extends Staff { //增加手下的员工 public void addSubordinate(Staff staff); //获得手下员工的信息 public ArrayList getSubordinate; //通知员工 public void notifyStaff(String note1,String note2); //从列表中删除下属成员 public void removeSubordinate(Staff staff);} 管理者接口有四个方法 , 分别是增加和删除下属成员 , 获取下属信息和通知下属消息 。
普通员工接口类 , 在这里指的当然就是程序员啦 , 只是一个空接口:
public interface IProgrammer extends Staff{} 在来看普通员工(程序员)的实现类 , 有两个属性 , 分别是姓名和职位 , 虽然大家都是程序员 , 但也是有职位之分的 。 然后是接收通知方法和获取个人信息方法的实现 , 接收通知方法的实现很简单 , 就是把自己的名字和职位以及被通知的内容打印出来(这里打印姓名和职位是为了和管理者进行对比) 。
public class Programmer implements IProgrammer{ private String name; private String position; public Programmer(String name,String position) { this.name = name; this.position = position; } @Override public String getInfo { String info = "姓名:"+this.name+" , 职位:"+this.position; return info; } @Override public void doSomething(String notice) { System.out.println(this.name+","+this.position+","+notice); }} 接下来是管理者的实现 , 同样拥有姓名和职位两个属性 , 并且还有维护一个下属成员的列表 , 用来保存手下所有的员工对象 。 增加下属就是往列表中添加一个对象 , 删除就是从下属列表中将该对象移除 。 查看下属成员是将下属成员列表返回 。 同时还有通知下属和接收上级通知的方法 , 通知下属时会遍历下属成员列表 , 如果该下属是普通员工(程序员) , 调用程序员的接收通知的方法 , 如果手下是管理者 , 调用管理者的接收通知的方法 , 同时将通知再向下级传递 。