java 之 组合模式(大话设计模式)
代码是一门艺术,每次看完大话设计模式后都会有新的认识,有时会感叹原来还可以这样玩,相信大家都用过递归,递归的使用一般遍历文件夹等会常用到,
今天讲的设计模式类似于递归,也比较神奇,先看下类图,稍后再帮大家理一下这个设计模式的核心思想。
大话设计模式-类图
类图看起来并不复杂,就像一棵大树,枝干上可以有树叶,也可以有分支树干,而分支树干上又可以有树叶...有点拗口,总的来说就是可以不断的扩展下去。
先看下例子,读者不妨把代码拷贝下去跟着断点运行一次,相信会对组合模式有更深刻的认识,然后在自己写个其他的例子,这样就会记住组合模式。先看下笔者的demo
/** * 抽象公司接口 */ public abstract class Company { private String name; public Company(String name) { super(); this.name = name; } public abstract void add(Company company); public abstract void remove(Company company); public abstract void display(int depth); public abstract void LineOfDuty(); public String getName() { return name; } public void setName(String name) { this.name = name; } }
/** * 具体公司 类似于树干 */ public class ConcreteCompany extends Company{ private List<Company> children = new ArrayList<>(); public ConcreteCompany(String name) { super(name); } @Override public void add(Company company) { children.add(company); } @Override public void remove(Company company) { children.remove(company); } @Override public void display(int depth) { for (int i = 0; i < depth; i++) { System.out.print("-"); } System.out.println(getName()); for (Company company : children) { company.display(depth + 2); } } @Override public void LineOfDuty() { for (Company company : children) { company.LineOfDuty(); } } }
/** * 具体部门,类似于树叶 */ public class HRDepartment extends Company { public HRDepartment(String name) { super(name); } @Override public void add(Company company) { } @Override public void remove(Company company) { } @Override public void display(int depth) { for (int i = 0; i < depth; i++) { System.out.print("-"); } System.out.println(getName()); } @Override public void LineOfDuty() { System.out.println(getName() + "\t员工培训"); } }
/** * 客户端 */ public class Test { public static void main(String[] args) { ConcreteCompany concreteCompany = new ConcreteCompany("北京朝阳公司"); concreteCompany.add(new HRDepartment("北京朝阳公司人力资源部")); ConcreteCompany concreteCompany1 = new ConcreteCompany("上海虹桥公司"); concreteCompany1.add(new HRDepartment("上海虹桥人力资源部")); concreteCompany.add(concreteCompany1); ConcreteCompany concreteCompany2 = new ConcreteCompany("深圳南山公司"); concreteCompany2.add(new HRDepartment("深圳南山人力资源部")); concreteCompany1.add(concreteCompany2); concreteCompany.display(1); concreteCompany.LineOfDuty(); } }
运行结果:
-北京朝阳公司 ---北京朝阳公司人力资源部 ---上海虹桥公司 -----上海虹桥人力资源部 -----深圳南山公司 -------深圳南山人力资源部 北京朝阳公司人力资源部 员工培训 上海虹桥人力资源部 员工培训 深圳南山人力资源部 员工培训
跟过断点的读者应该可以理解笔者所说的思想:层层嵌套循环A循环→B循环→C循环...一直把所有的循环全部进行完毕。从对象的角度来看,在循环里不断切换调用同一个方法的对象,直到全部调用完毕
如果还是理解不了,那就多跟几次断点,一次不行就两次。明白原理后在写个遍历文件的例子。
以上是是笔者对组合模式的理解,希望能帮助学习的小伙伴!