下面来学习一下组合模式。
组合模式概念是什么呢。从别的地方抄来了一些理论。
理论:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
拙见:组合模式就是为处理树形结构优化出来的一套理论方法。-_-!!!用递归可以统一处理树形结构中的对象。
下面直接上代码。
总公司 --分公司
--分公司下属分公司
--分公司下属办事处
--分公司办事处
接口类ICompany。
1 import java.util.List;
2
3 public interface ICompany {
4 public void display();
5 public boolean add(ICompany company);
6 public boolean remove(ICompany company);
7 public List<ICompany> getChild();
8 }
公司类Company。
1 import java.util.ArrayList;
2 import java.util.List;
3
4 public class Company implements ICompany {
5 private String name;
6 private List<ICompany> children;
7
8 public Company(String name) {
9 this.name = name;
10 this.children = new ArrayList<ICompany>();
11 }
12 @Override
13 public void display() {
14 System.out.println(name);
15 }
16 @Override
17 public boolean add(ICompany company) {
18 return children.add(company);
19 }
20 @Override
21 public boolean remove(ICompany company) {
22 return children.remove(company);
23 }
24 @Override
25 public List<ICompany> getChild() {
26 return children;
27 }
28 }
办事处类ConcreteCompany。
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class ConcreteCompany implements ICompany { 5 private String name; 6 7 public ConcreteCompany(String name) { 8 this.name = name; 9 } 10 @Override 11 public void display() { 12 System.out.println(name); 13 } 14 @Override 15 public boolean add(ICompany company) { 16 return false; 17 } 18 @Override 19 public boolean remove(ICompany company) { 20 return false; 21 } 22 @Override 23 public List<ICompany> getChild() { 24 return null; 25 } 26 }
测试类MainClass。
1 import java.util.List;
2
3 /*
4 * 组合模式测试
5 */
6 public class MainClass {
7 public static void main(String[] args) {
8 ICompany company = new Company("总公司");
9 ICompany company1 = new Company("分公司1");
10 ICompany company2 = new Company("分公司2");
11 ICompany company3 = new ConcreteCompany("分公司办事处");
12 company.add(company1);
13 company.add(company2);
14 company.add(company3);
15
16 ICompany company11 = new Company("分公司1下属公司1");
17 ICompany company12 = new Company("分公司1下属公司2");
18 ICompany company13 = new ConcreteCompany("分公司1下属办事处");
19 company1.add(company11);
20 company1.add(company12);
21 company1.add(company13);
22
23 ICompany company21 = new Company("分公司2下属公司");
24 ICompany company22 = new ConcreteCompany("分公司2下属办事处");
25 company2.add(company21);
26 company2.add(company22);
27
28 displayAllCompany(company, 0);
29 }
30
31 private static void displayAllCompany(ICompany rootCompany, int deep) {
32 for(int i = 0; i < deep; i++)
33 {
34 System.out.print("-");
35 }
36 rootCompany.display();
37 List<ICompany> children = rootCompany.getChild();
38 for(ICompany company:children)
39 {
40 if(company instanceof ConcreteCompany)
41 {
42 for(int i = 0; i <= deep; i++)
43 {
44 System.out.print("-");
45 }
46 company.display();
47 }
48 else
49 {
50 displayAllCompany(company, deep + 1);
51 }
52 }
53
54 }
55 }
以上代码主要就是用递归方法遍历了公司的结构。
测试结果。
这个模式的精华都在代码里,大家自己体会吧。。。共同进步!!!