JAVA设计模式-组合模式

目录

1、例子

2、组合模式基本定义

总结:


1、例子

编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系
组成,一个学校有多个学院,一个学院有多个系

传统解决方案:

 分析:

1、将学院看做是学校的子类,系是学院的子类。这样实际上是站在组织大小来进行分层次的

2、实际上我们的要求是:在一个页面中展现出学校的院系组成。一个学校有多少学院,一个学院有多少个系。因此这种方案,不能很好实现的管理的操作。比如对学院。系的添加。删除,变了等

3、解决方案:把学校、院、系都看做事组织架构。他们之间没有继承的关系。而是一个树形结构。可以更改的实现管理操作=>组合模式

2、组合模式基本定义

2.1、组合模式,又叫部分整体模式,它创建了对象组的树形结构。将对象组合成树状结构以表示“整体-部分”的层次关系

2.2、组合模式依据树形结构来组合对象。用来表示部分以及整体层次

2.3、这种类型的设计模式属于结构型模式

2.4、组合模式使得用户对单个对象和组合对象的访问具有一致性

即:组合能让客户以一致的方式处理个别对象以及组合对象

2、Leaf;在组合中表示叶子节点,叶子节点没有子节点

3、Composite:非叶子节点,用户存储子部件, 在Component接口中实现子部件的相关操作,比如增加,删除

解决的问题:

1、组合模式解决这样的问题。当我们的要处理的对象可以生产一颗树形结构,而我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子

 

 

public class University extends OrganizationComponent {

    List<OrganizationComponent> orgs=new ArrayList<>();



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

    @Override
    protected void add(OrganizationComponent org) {
        orgs.add(org);
    }

    @Override
    protected void remove(OrganizationComponent org) {
        orgs.remove(org);
    }

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

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

    //print方法,就是输出University 包括的学院
    @Override
    protected void print() {
        System.out.println("----------"+getName()+"-------");
        //遍历orgs
        for (OrganizationComponent org : orgs) {
            org.print();
        }
    }
}
public class College  extends OrganizationComponent{

    //list中
    List<OrganizationComponent> orgs=new ArrayList<>();

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

    @Override
    protected void add(OrganizationComponent org) {
        orgs.add(org);
    }

    @Override
    protected void remove(OrganizationComponent org) {
        orgs.remove(org);
    }

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

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

    //print方法,就是输出University 包括的学院
    @Override
    protected void print() {
        System.out.println("----------"+getName()+"-------");
        //遍历orgs
        for (OrganizationComponent org : orgs) {
            org.print();
        }
    }
}
public class Department extends OrganizationComponent{

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

    //add,remove 就不用写了,因为他是叶子节点
    @Override
    protected void print() {
        System.out.println(getName());
    }

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

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

    private String name;//名字
    private String des;//说明

    protected  void add(OrganizationComponent org){
        //默认实现
        throw new UnsupportedOperationException();
    }

    protected void remove(OrganizationComponent org){
        //默认实现
        throw new UnsupportedOperationException();
    }

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

    //方法print 抽象
    protected abstract void print();

    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;
    }
}
public class Clinet {
    public static void main(String[] args) {
        //从大道小创建对象
        OrganizationComponent university = new University("清华大学", "中国顶级大学");

        //创建 学院
        OrganizationComponent college = new College("计算机学院", "计算机学院");
        OrganizationComponent college1 = new College("信息工程学院", "信息工程学院");

        //创建各个学院下面的系(专业)
        college.add(new Department("软件工程","软件工程"));
        college.add(new Department("网络工程","网络工程"));
        college.add(new Department("计算机","计算机"));



        college1.add(new Department("信息工程","信息工程"));
        college1.add(new Department("智能工程","智能工程"));
        college1.add(new Department("大数据工程","大数据工程"));

        university.add(college);
        university.add(college1);

       // university.print();
        college.print();

    }
}

总结:

组织关系由原来的串式流程。变为树状流程。顶层是抽象。后面是各级管理。以及最后节点
各级管理组合或者聚合顶级抽象。实现方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐路上的小人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值