JAVA设计模式笔记(组合模式)

组合模式又叫整体和部分模式,它创建了对象组的树形结构,将对象组合成树形结构以表示“整体和部分”的层次关系。组合模式属于结构形模式。
在这里插入图片描述
组合模式的角色:
1、抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。
2、树叶构件(Leaf)角色:叶子节点没有子节点
3、树枝构件(Composite)角色:树枝构件类给出所有的管理子对象的方法,如add()、remove()以及getChild()。

组合模式解决的问题:组合模式解决这样一个问题,就是我对树上的节点和叶子进行操作的时候,能提供一致性的方法,而不需要考虑操作的对象是节点还是叶子。当叶子和树枝有较大差异的时候,就不适合用组合模式。

案例
有一所大学,下面有学院、专业等机构,现在需要编程去表示各机构的关系,需要用到组合模式

Component角色

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;
    }

    @Override
    public String toString() {
        return "OrganizationComponent{" +
                "name='" + name + '\'' +
                ", des='" + des + '\'' +
                '}';
    }
    protected abstract void print();
}

树枝角色

//学校
public class University extends OrganizationComponent {
    List<OrganizationComponent> organizationComponents=new ArrayList<>();

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

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

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

    @Override
    protected void print() {
        System.out.println("------"+getName()+"--------");
        for(OrganizationComponent organizationComponent:organizationComponents){
            organizationComponent.print();
        }
    }
    //院系
    public class College extends OrganizationComponent {
    List<OrganizationComponent> organizationComponents=new ArrayList<>();

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

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

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

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

叶子角色

//专业
public class Department extends OrganizationComponent {

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

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

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

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

客户端调用

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

        OrganizationComponent university=new University("清华大学","顶级大学");
        OrganizationComponent computerCollege=new College("计算机学院","计算机学院");
        OrganizationComponent infoEngineerCollege=new College("信息工程学院","信息工程学院");
        computerCollege.add(new Department("软件工程","软件工程"));
        computerCollege.add(new Department("网络工程","网络工程"));
        infoEngineerCollege.add(new Department("通信工程","通信工程"));
        infoEngineerCollege.add(new Department("电子信息工程","电子信息工程"));
        university.add(computerCollege);
        university.add(infoEngineerCollege);
        university.print();
    }
}

发布了56 篇原创文章 · 获赞 3 · 访问量 1630

猜你喜欢

转载自blog.csdn.net/qq_20786911/article/details/103532293
今日推荐