Java设计模式---组合模式

组合模式应用举例子:我们开发一个需求,要求呈现学校+学院+专业的场景,便于学校管理学院,学院管理专业。
解决方案:传统的思维是,写一个学校类,再写一个学院类继承学校,再写一个专业类继承学院。缺点:这种结构不适合进行各个层级的管理。
组合模式:采用聚合的方式,写一个组合的抽象类或者接口,然后学校和学院继承或者实现该类。


组合模式的使用场景:
1、需要遍历的组织机构或者处理的对象具有树形结构。
2、如果节点和叶子存在很多差异性的话,属性和方法都不一样,就不太适合使用该模式。


组合模式使用的具体例子:
JDK中 Map接口,abstractMap, hashMap 其中的node方法就相当于 叶子节点
废话不多说,直接上代码:

创建组合抽象类或者接口

public abstract class OrganizationComponent {
    private String name;
    private String des;

    protected void add(OrganizationComponent organizationComponent){
        throw new UnsupportedOperationException();
    }

    protected void remove(OrganizationComponent organizationComponent){
        throw new UnsupportedOperationException();
    }

    public OrganizationComponent(String name, String des) {
        this.name = name;
        this.des = des;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

    protected abstract  void print();
}

创建学校类:


//可以管理学校
public class University extends OrganizationComponent{

    //存放的是College
    List<OrganizationComponent> organizationComponentlist = new ArrayList<OrganizationComponent>();

    public University(String name, String des) {
        super(name, des);
    }

    @Override
    protected void print() {
        System.out.println("----------------"+getName()+"-------------");
        for (OrganizationComponent orl: organizationComponentlist) {
            orl.print();
        }
    }

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponentlist.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponentlist.remove(organizationComponent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public void setName(String name) {
        super.setName(name);
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    public void setDes(String des) {
        super.setDes(des);
    }
}

创建学院类:

public class College extends OrganizationComponent{

    //存放的是department
    List<OrganizationComponent> organizationComponentlist = new ArrayList<OrganizationComponent>();

    public College(String name, String des) {
        super(name, des);
    }

    @Override
    protected void print() {
        System.out.println("----------------"+getName()+"-------------");
        for (OrganizationComponent orl: organizationComponentlist) {
            orl.print();
        }
    }

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponentlist.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponentlist.remove(organizationComponent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public void setName(String name) {
        super.setName(name);
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    public void setDes(String des) {
        super.setDes(des);
    }
}

创建最后的专业系类(最后的节点是没有管理方法的):

public class Department extends OrganizationComponent{

    //因为是叶子节点,所以add 和remove方法就不需要了

    public Department(String name, String des) {
        super(name, des);
    }

    @Override
    protected void print() {
        System.out.println(getName());

    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }
}

测试类如下:

public class Client {
    public static void main(String[] args) {

        OrganizationComponent university = new University("麻省理工","美国一流大学");
        OrganizationComponent computerCollege = new College("计算机学院","学校里最好的学院");
        OrganizationComponent businessCollege = new College("工商管理学院","最有钱的学院");

        //创建各个学院下面的系
        computerCollege.add(new Department("软件工程","学习软件"));
        computerCollege.add(new Department("网络工程","学习网络"));
        computerCollege.add(new Department("计算机科学与技术","学习计算机原理"));

        businessCollege.add(new Department("工商管理","学习工商管理"));
        businessCollege.add(new Department("会计","学习会计"));
        businessCollege.add(new Department("工商英语","学习工商英语"));

        //将两个学院加入到学校中
        university.add(computerCollege);
        university.add(businessCollege);

        university.print();
//        computerCollege.print();
    }
}

最后输出的结果如下,很清晰,舒服!

----------------麻省理工-------------
----------------计算机学院-------------
软件工程
网络工程
计算机科学与技术
----------------工商管理学院-------------
工商管理
会计
工商英语

猜你喜欢

转载自blog.csdn.net/LB_Captain/article/details/114528657