设计模式详解(十一)——组合模式

这篇具有很好参考价值的文章主要介绍了设计模式详解(十一)——组合模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

组合模式简介

组合模式定义
组合模式(Composite Pattern)是一种结构型设计模式,又叫部分整体模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

组合模式包含以下角色:

  1. Component(抽象构件):抽象构件可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类公有行为的声明和实现,包括添加(add)、删除(remove)、获取子组件(getChildren)以及实现业务逻辑的方法(operation)。它是一个定义了公共的操作方法,可以用于管理和访问component子部件的抽象对象。
  2. Leaf(叶子构件):叶子构件在组合结构中表示叶子节点对象,叶子节点没有子节点,实现了抽象组件接口或抽象类,但没有子组件。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。叶子节点是树形结构中的最底层对象,通常包含具体的业务逻辑实现。
  3. Composite(树枝节点构件):枝节点构件在组合结构中表示容器节点对象,枝节点节点包含子节点,其子节点可以是叶子节点,也可以是其它枝节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义行为,包括那些访问及管理子构件对方法,在其业务方法中可以递归调用其子节点对业务方法。并允许客户端以统一的方式处理其子组件。
  4. Client(客户类):使用组合模式来创建和操作复合对象结构。客户端代码不需要关心对象是叶子节点还是树枝节点,因为所有对象都通过抽象组件接口或抽象类来访问。

组合模式优缺点:
优点:

  1. 客户端代码可以一致地处理单个对象和组合对象,无需关心它们之间的区别。简化了客户端代码;
  2. 组合模式可以优化处理递归或分级数据结构,因为它将对象组织成树形结构,使得对对象的处理更加直观和高效。
  3. 容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

缺点:

  1. 设计复杂性:组合模式可能使设计变得更加复杂,特别是当类之间的层次关系变得复杂时。客户端需要花更多时间来理解这些关系,从而正确地使用组合模式。
  2. 限制容器中的构件:在组合模式中,当需要添加新的容器构件或叶子构件时,可能很难对容器中的构件类型进行限制。这可能导致设计上的混乱和不必要的复杂性。
  3. 继承方法的限制:组合模式通常使用继承来实现,但这可能会限制新的构件只能通过继承来添加新功能。这可能限制了系统的灵活性和可扩展性。
  4. 依赖倒置原则的违反:在某些实现中,组合模式的叶子和树枝的声明可能是实现类而不是接口,这违反了依赖倒置原则。这可能导致代码之间的耦合度过高,不利于维护和扩展。

使用场景

  1. 表示对象的部分和整体层次结构:当需要表示一个对象的部分以及整体层次结构时,组合模式是一个很好的选择。例如,在文件系统中,根目录下有若干文件和目录,在二级目录下还有目录和文件,这种情况下适合使用组合模式。
  2. 忽略组合对象与单个对象的差异:如果客户端需要忽略组合对象与单个对象的差异,以一致的方式处理它们,那么可以使用组合模式。这样,客户端代码可以简化,因为无需关心处理的是单个对象还是组合对象。
  3. 处理递归或分级数据结构:组合模式可以优化处理递归或分级数据结构。通过将对象组织成树形结构,组合模式使得对这些对象的处理更加直观和高效。

通俗来讲就是:
比如在现实生活中,存在很多“部分-整体”的关系。汽车与轮胎、发动机的关系。警察局与科室、警察的关系。学校与学院、学生、老师的关系。
组合模式是一种非常普遍和常用的模式,接口服务互相组合,提供更丰富的接口,实现复杂的业务逻辑。一般情况会选择使用组合代替继承,组合更灵活、更方便。

以下举一个组合模式的例子:
假设学校中有校长管理老师,老师学生,通过以下实例演示学校中人员的层次结构:

创建抽象类,组件Persion 【Component(组件)】

import java.util.List;

/**
 * Component(组件)
 *
 * 为组合中的对象声明接口
 * 声明一个接口用于访问和管理Component的子组件
 */

public abstract class Persion {
    private String name;
    protected List<Persion> persionList;

    public abstract void add(Persion persion);
    public abstract void delete(Persion persion);

    public void input() {
        System.out.println(String.format("name is %s", name));
    };

    public String getName() {
        return name;
    }

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

    public List<Persion> getPersionList() {
        return persionList;
    }
}

创建具体类Principal【Composite(树枝节点构件)】

import java.util.ArrayList;

/**
 * Composite(树枝节点构件)
 *
 * 实现了在抽象构件中定义行为,包括那些访问及管理子构件对方法
 * 存储子部件
 *
 */
public class Principal extends Persion {
    public Principal(String name) {
        setName(name);
        persionList = new ArrayList<Persion>();
    }

    @Override
    public void add(Persion persion) {
        persionList.add(persion);
    }

    @Override
    public void delete(Persion persion) {
        persionList.remove(persion);
    }
}

创建具体类Teacher【Composite(树枝节点构件)】

import java.util.ArrayList;

/**
 * Composite(树枝节点构件)
 *
 * 实现了在抽象构件中定义行为,包括那些访问及管理子构件对方法
 * 存储子部件
 *
 */
public class Teacher extends Persion {
    public Teacher(String name) {
        setName(name);
        persionList = new ArrayList<Persion>();
    }

    @Override
    public void add(Persion persion) {
        persionList.add(persion);
    }

    @Override
    public void delete(Persion persion) {
        persionList.remove(persion);
    }
}

创建具体类Student【Leaf(叶子构件)】

/**
 * Leaf(叶子构件)
 *
 * 叶子构件在组合结构中表示叶子节点对象,叶子节点没有子节点
 * 对于那些访问及管理子构件的方法,可以通过异常等方式进行处理
 */
public class Student extends Persion{
    public Student(String name) {
        setName(name);
        persionList = null;
    }

    @Override
    public void add(Persion persion) {
    }

    @Override
    public void delete(Persion persion) {
    }
}

创建测试类【Client(客户类)】

/**
 * Client(客户类)
 * 使用组合模式来创建和操作复合对象结构
 *
*/
public class Client {
    public static void main(String[] args) {
        Persion principal = new Principal("校长");
        Persion teacher1 = new Teacher("教师1");
        Persion teacher2 = new Teacher("教师2");
        Persion student1 = new Student("学生1");
        Persion student2 = new Student("学生2");
        Persion student3 = new Student("学生3");
        Persion student4 = new Student("学生4");

        principal.add(teacher1);
        principal.add(teacher2);
        teacher1.add(student1);
        teacher1.add(student2);
        teacher2.add(student3);
        teacher2.add(student4);

        info("无需", principal);
    }

    public static void info(String pre ,Persion persion){
        System.out.println(String.format("%s管理:%s", pre, persion.getName()));

        if(null == persion.getPersionList()){
            return;
        }
        for(Persion persion1 : persion.getPersionList()){
            info(persion.getName(), persion1);
        }

    }

}

输出结果如下所示:

无需管理:校长
校长管理:教师1
教师1管理:学生1
教师1管理:学生2
校长管理:教师2
教师2管理:学生3
教师2管理:学生4

从结果可以看成功根据需求,获取到了校长管理老师,老师管理学生的层级结构。

总而言之:
组合模式,它是一种非常强大的结构型设计模式,用于创建复杂的对象结构,允许用户以统一的方式处理单个对象和复合对象。通过组合模式,你可以构建出具有层次结构的对象模型,这些对象可以像单个对象一样被简单、一致地使用。
组合模式提供一个结构,可同时包容个别对象和组合对象;允许客户对个别对象以及组合对象一视同仁;组合结构内的任意对象称为组件;组件可以是组合,也可以是叶节点;在使用组合模式时,要多加考虑方式,有的时候可以与迭代器模式配合使用。


以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git文章来源地址https://www.toymoban.com/news/detail-835365.html

到了这里,关于设计模式详解(十一)——组合模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式——10. 组合模式

    组合模式是一种结构型设计模式,用于将对象组合成树状结构以表示“部分-整体”的层次结构。它允许客户端以一致的方式处理单个对象和组合对象(包含多个对象的容器),使得客户端无需关心它们之间的差异。 组合模式通常涉及两种主要角色: 叶子节点(Leaf):这是组

    2024年02月07日
    浏览(65)
  • 设计模式——组合模式08

    组合模式:把类似对象或方法组合成结构为树状的设计思路。 例如部门之间的关系。 设计模式,一定要敲代码理解 满足开闭原则。叶子结点与非叶子结点都继承或实现同一抽象,只是叶子功能权限少,而非叶子结点需要容器记录子节点。 代码下载

    2024年04月11日
    浏览(48)
  • 设计模式:组合模式

    组合模式是一种结构型设计模式,用于将对象组织成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,而不需要区分它们之间的差异。 在组合模式中,有两种主要类型的对象:叶节点和组合节点。叶节点表示树结构中的

    2024年02月07日
    浏览(59)
  • 设计模式--组合模式

    某日,小明公司最近接到一个办公管理系统的项目,并且在每个城市都有分部。这属于是很常见的OA系统,只要前期将需求分析完善好,中后期开发维护是不难的。 然而,总部公司使用后觉得很OK,想要其他城市的分公司也执行使用。但是现在的问题是,其他分公司的部门和

    2024年01月21日
    浏览(58)
  • 结构型设计模式之组合模式【设计模式系列】

    C++技能系列 Linux通信架构系列 C++高性能优化编程系列 深入理解软件架构设计系列 高级C++并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reali

    2024年02月15日
    浏览(46)
  • 设计模式浅析(十) ·设计模式之迭代器&组合模式

    日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 案例 有两家门店,门店A呢只提供早餐,门店B呢只提供午餐,有一天这两家店铺想要进行合并,一起做大做强,再创辉煌。 合并后呢,对于菜单的定制存在了一定的问题: 门店A的

    2024年04月11日
    浏览(47)
  • Java设计模式-组合模式

    在软件设计中,设计模式是一种被广泛接受和应用的经验总结,旨在解决常见问题并提供可复用的解决方案。 组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式能够使客户端以一致的方式处理单个对象和对象集合,将

    2024年02月06日
    浏览(40)
  • 【23种设计模式】组合模式【⭐】

    个人主页 :金鳞踏雨 个人简介 :大家好,我是 金鳞 ,一个初出茅庐的Java小白 目前状况 :22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客 :这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进

    2024年02月09日
    浏览(43)
  • 设计模式之组合模式笔记

    记录下学习设计模式-组合模式的写法。JDK使用版本为1.8版本。 意图 :将对象组合成树型结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 结构 : 其中: Component为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认

    2024年02月11日
    浏览(38)
  • 设计模式-组合模式(Composite)

    组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构以表示“整体-部分”的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而不需要区分它们。 在本篇博客中,我们将详细介绍组合模式的概念,并提供一个简单的Java代码示

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包