组合模式:树先生的克星

801 阅读2分钟

需求来了

今天领导叫过过去,说到,小陈,今年公司新的组织架构图出来了,如下图:

你做一个简单的系统,可以方便的表示他们的上下级关系和他们的序号吧。

需求的思考

针对这样的一个需求,根据上面的组织架构图,我很快的想到了采用组织设计模式进行架构的设计。 

那么组织设计模式是什么呢? 

通俗一点讲:上层节点和下层节点的结构是一样的或者相似的

比如 张三,他的内部包括他的名字、他的工号、和他的子员工(李四和王五), 

而王五呢,他的内部包括他的名字,他的工号,和他的子员工(赵六和陈七) ,

很显然,他们的结构是一致的,像这样的一种模型,我们就可以用组织设计模型进行架构设计。 

需求的实现

第一步:定义节点

package com.example.createproject;

import java.util.ArrayList;

/**
 * 每一个节点,这个节点就是人
 */
public class Person {

    public String name; // 名字
    public int index; // 序列号

    public Person(String name, int index) {
        this.name = name;
        this.index = index;
    }

    public ArrayList<Person> leafPersonList = new ArrayList<>(); // 子节点列表

    public void addPerson(Person person){
        leafPersonList.add(person);
    }
}

第二步:节点数据初始化和节点数据遍历操作。

package com.example.createproject;

import android.util.Log;

import java.util.ArrayList;

import javax.xml.namespace.QName;

public class PersonManager {

    private static final String TAG = PersonManager.class.getSimpleName();

    private Person init() {
        Person zhang3 = new Person("张三", 001);
        Person li4 = new Person("李四", 002);
        Person wang5 = new Person("王五", 003);
        Person zhao6 = new Person("赵六", 004);
        Person chen7 = new Person("赵六", 005);

        zhang3.addPerson(li4);
        zhang3.addPerson(wang5);

        wang5.addPerson(zhao6);
        wang5.addPerson(chen7);

        return zhang3;
    }

    /**
     * 展示所有人的信息
     */
    public void show() {
        Person person = init();
        show(person);
    }

    /**
     * 递归调用
     * @param person
     */
    public void show(Person person) {
        Log.e(TAG,person.name + " " + person.index);
        ArrayList<Person> list = person.leafPersonList;
        if (list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                Person temp = list.get(i);
                show(temp);
            }
        }
    }

}

组合模式的使用场景

如果一组数据是树状结构的数据结构,并且每个节点的结构都是一样的或者相似的,那么就可以采用组合设计模式去设计存储结构。

比如:

 1、文件、文件夹系统,实现目录选择器。

 2、人员组织架构。

 3、View、ViewGroup的嵌套组合。 

4、省、市、区的图。 

总结

1、可能很多的同学在平时工作中也会用到这种方式来封装树状数据,但是自己并不知道采用了组合设计模式,通过今天的学习,发现组合设计模式原来如此。

2、最后让我们一起大声呼喊:组合设计模式就是为了封装树状结构而生的。