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


首先看一下透明方式的类图:
【程序员】看了这篇你将彻底了解组合模式
本文插图
透明性具体代码如下 , 为了充分体现透明性 , 代码和上面的改动有些大:
抽象类Staff(相当于Component)
package Composite;import java.util.ArrayList;public abstract class Staff { public abstract void getInfo; public abstract void doSomething(String notice); //增加一个手下 public void addSubordinate(Staff staff) { throw new UnsupportedOperationException("不支持这个功能"); } public void removeSubordinate(Staff staff) { throw new UnsupportedOperationException("不支持这个功能"); } //查看我的手下 public ArrayList getSubordinate { return ; } public void notifyStaff(String notice1,String notice2){ }} 抽象类中定义了对员工操作的所有方法 , 包括增加 , 删除 , 查看和通知 。 还包括普通员工和管理者都有的获取个人信息方法和接收通知方法 , 这两个方法定义为抽象方法 。
普通员工类(相当于Leaf)
package Composite;public class Programmer extends Staff{ private String name; private String position; public Programmer(String name, String position) { this.name = name; this.position = position; } @Override public void getInfo { String info = "姓名:"+this.name+" , 职位:"+this.position; System.out.println(info); } @Override public void doSomething(String notice) { System.out.println(this.name+","+this.position+","+notice); }} 这个类比较简单 , 就是增加了两个属性和实现了两个抽象方法 。
管理者类(相当于Composite)
package Composite;import java.util.ArrayList;//管理者public class Manager extends Staff { private String name; private String position; public Manager(String name, String position) { this.name = name; this.position = position; } //他的手下列表 ArrayList subordinateList = ; public void addSubordinate(Staff staff) { //延迟初始化 if(subordinateList == ){ subordinateList = new ArrayList; } subordinateList.add(staff); } public ArrayList getSubordinate { return this.subordinateList; } @Override public void getInfo { //先将自己输出 String info = "姓名:"+this.name+" , 职位:"+this.position; System.out.println(info); if(this.subordinateList !=){ //输出下属对象 for(Staff s:subordinateList){ //递归调用