(@WhiteTaken)设计模式学习——组合模式

Posted WhiteTaken

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(@WhiteTaken)设计模式学习——组合模式相关的知识,希望对你有一定的参考价值。

下面来学习一下组合模式。

组合模式概念是什么呢。从别的地方抄来了一些理论。

理论:将对象组合成树形结构以表示“部分-整体”的层次结构。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 }

以上代码主要就是用递归方法遍历了公司的结构。

测试结果。

这个模式的精华都在代码里,大家自己体会吧。。。共同进步!!!

 

以上是关于(@WhiteTaken)设计模式学习——组合模式的主要内容,如果未能解决你的问题,请参考以下文章

(@WhiteTaken)设计模式学习——抽象工厂模式

(@WhiteTaken)设计模式学习——单例模式

(@WhiteTaken)设计模式学习——享元模式

(@WhiteTaken)设计模式学习——建造者模式

设计模式学习系列——组合模式

设计模式学习笔记——组合模式