浅显易懂的组合模式

一、引言

组合模式是什么?为什么要有组合模式?组合模式怎么实现?

  1. 组合模式,又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
  2. 为什么要有组合模式?组合模式广泛适用于对具有层级关系对象的操作,例如对学校,学院,班级增删对文件夹,文件增删等层级关系的操作。可以不用考虑是父还是子,直接对其操作即可。

二、实现组合模式

先上类图:
在这里插入图片描述
所有的学校,学院,班级,都继承一个类(组织),然后学校中有学院list通过add方法添加,remove方法移除,参数都为组织。
这样无论你是学校还是学院,想要添加下属级别,只要调用方法add即可,达到操作上的统一。
下面代码实现一波:

/**
 * 组织类
 */
public abstract class Organization {
    private String name;//所有组织都有一个名称:学校名称,学院名称,班级名称
    //构造方法
    public Organization(String name){
        this.name=name;
    }
    
    //添加方法,这里作空实现,子类重写即可
    public void add(Organization organization){
    }
    //删除方法,这里作空实现,子类重写即可
    public void remove(Organization organization){
    }

    //展示组织信息方法为抽象,子类必须重写
    public abstract void display();

    //下面是get,set方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
/**
 * 学校继承于组织
 */
public class School extends Organization{
    private List<Organization> list=new ArrayList<>();//学院list

    //调用父类构造方法
    public School(String name) {
        super(name);
    }


    //重写add方法
    public void add(Organization organization) {
        list.add(organization);
    }

    //重写remove方法
    public void remove(Organization organization) {
        list.remove(organization);
    }

    //展现操作
    //打印本学校名字,下面遍历list集合里面元素,并调用他们的展示方法
    public void display() {
        System.out.println("---------------"+this.getName()+"---------------------");
        for (Organization organization : list) {
            organization.display();
        }
    }
}
/**
 * 学院继承于组织
 */
public class College extends Organization{
    private List<Organization> list=new ArrayList<>();//班级list
    public College(String name) {
        super(name);
    }


    //重写add方法
    public void add(Organization organization) {
        list.add(organization);
    }

    //重写remove方法
    public void remove(Organization organization) {
        list.remove(organization);
    }

    //展示方法,和学校无异
    public void display() {
        System.out.println("---------------"+this.getName()+"---------------------");
        for (Organization organization : list) {
            organization.display();
        }
    }
}
/**
 * 班级继承于组织
 */
public class Class extends Organization{
    public Class(String name) {
        super(name);
    }

    @Override
    public void display() {
        System.out.println("---------------"+this.getName()+"---------------------");
    }
}

下面是Main方法,对各组织进行增删查

public static void main(String[] args) {
        //学校
        School school = new School("华南理工大学广州学院");

        //专业
        College college1 = new College("计算机工程学院");
        College college2 = new College("外国语学院");


        //班级
        Class aClass1 = new Class("软件1班");
        Class aClass2 = new Class("软件2班");

        Class aClass3 = new Class("日语1班");
        Class aClass4 = new Class("日语2班");

        //对学院,班级添加操作
        school.add(college1);
        school.add(college2);

        college1.add(aClass1);
        college1.add(aClass2);

        college2.add(aClass3);
        college2.add(aClass4);

        //展示所有组织操作
        System.out.println("------------------展示学校所有信息-----------------------");
        school.display();
        System.out.println("------------------展示计算机学院所有信息-----------------------");
        college1.display();
}

程序运行结果如下图:
在这里插入图片描述
代码虽多,但是相对简单,根据类图一步一步分析,注释打满,不多作描述。

三、结束

组合模式很微妙,记住一个点,适用于具有层级关系(树)的对象进行操作的时候。

猜你喜欢

转载自blog.csdn.net/laowang__/article/details/105471653