笨蛋学设计模式结构型模式-组合模式【12】

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

7.6组合模式

7.6.1概念

​ 组合模式通过将对象组合成树状结构来表示 部分-整体的层次关系,从而让客户端能够以同样的方式处理单个对象和对象组合,在使用中将他们视为同一类型的对象。

7.6.2场景

​ 在文件系统中,比如目录和文件就形成了一个树形结构,目录可以包含文件以及子目录,而子目录同样的也可以包含文件以及子目录的子目录。

7.6.3优势 / 劣势

  • 一致性:客户端可以统一的处理单个对象和对象的组合,简化了客户端的代码
  • 动态性:组合模式支持动态地添加或删除子对象,使得树形结构的构建更加灵活

  • 复杂性:由于树形机构的嵌套特性,可能会增加代码的复杂性
  • 深度限制:若组合模式的树形结构的深度过大,可能会导致性能问题

7.6.4组合模式可分为

  • 组件Component:组合模式的根节点,定义组合中所有对象的通用接口,可以是抽象类或接口。该类中定义了子类的共性内容
  • 叶子Leaf:实现了Component接口的叶子节点,表示组合中的叶子对象,叶子节点没有子节点
  • 合成Composite:作用是存储子部件,并且在Composite中实现了对子部件的相关操作,比如添加、删除、获取子组件等

7.6.5组合模式

package com.technologystatck.designpattern.mode.combination;

import java.util.ArrayList;
import java.util.List;

public class Combination {
    public static void main(String[] args) {
        //创建叶子节点
        Leaf leaf = new Leaf();

        //创建组合节点,并添加叶子节点
        Composite composite = new Composite();
        composite.add(leaf);

        //统一调用
        composite.operation();

        System.out.println("----------------------");
        composite.remove(leaf);
        composite.operation();
    }
}

//组件接口
interface Component{
    void operation();
}

//叶子节点
class Leaf implements Component{

    @Override
    public void operation() {
        System.out.println("Leaf operation");
    }
}

//组合节点
class Composite implements Component{
    private List<Component> components=new ArrayList<>();

    public void add(Component component){
        components.add(component);
    }

    public void remove(Component component){
        components.remove(component);
    }

    @Override
    public void operation() {
        System.out.println("Composite operation");
        for(Component component:components){
            component.operation();
        }
    }
}

7.6.6实战

7.6.6.1题目描述

小明所在的公司内部有多个部门,每个部门下可能有不同的子部门或者员工。

请你设计一个组合模式来管理这些部门和员工,实现对公司组织结构的统一操作。部门和员工都具有一个通用的接口,可以获取他们的名称以及展示公司组织结构。

7.6.6.2输入描述

第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。

接下来的 N 行,每行描述一个部门或员工的信息。部门的信息格式为 D 部门名称,员工的信息格式为 E 员工名称,其中 D 或 E 表示部门或员工。

7.6.6.3输出描述

输出公司的组织结构,展示每个部门下的子部门和员工

7.6.6.4代码
package com.technologystatck.designpattern.mode.combination;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //先读取公司名称
        String companyName = scanner.nextLine();

        //创建公司对象,并设置公司名称,并将公司添加到树枝节点中
        Company company = new Company(companyName);


        //读取部门和员工信息
        int nums = scanner.nextInt();
        scanner.nextLine();
        for(int i=0;i<nums;i++){
            String type = scanner.next();
            //获取名字并去除空格,以便后续添加到组合节点中
            String name = scanner.nextLine().trim();

            if("D".equals(type)){
                //创建部门对象,并添加到组合节点中
                company.add(new Department(name));
            }else if("E".equals(type)){
                //创建员工对象,并添加到组合节点中
                company.add(new Employee(name));
            }
        }
        //显示公司信息
        company.display();

    }
}

//组件接口
interface Components{
    void display(int depth);
}

//部门的叶子节点
class Department implements Components{

    //部门名称
    private String name;
    //部门下的员工
    private List<Components> children;

    public Department(String name) {
        this.name = name;
        this.children = new ArrayList<>();
    }

    //添加员工
    public void add(Components component){
        children.add(component);
    }
    //删除员工
    public void remove(Components component){
        children.remove(component);
    }
    @Override
    public void display(int depth) {
        StringBuilder indent = new StringBuilder();
        for(int i = 0;i < depth;i++){
            //一个空格
            indent.append(" ");
        }
        System.out.println(indent + name);
        for (Components components : children) {
            components.display(depth+1);
        }
    }
}

//员工的叶子节点
class Employee implements Components{
    //员工名
    private String name;

    public Employee(String name) {
        this.name = name;
    }

    @Override
    public void display(int depth) {
        StringBuilder indent = new StringBuilder();
        for(int i = 0;i < depth;i++){
            //两个空格,用于缩进显示层级关系
            indent.append("  ");
        }
        System.out.println(indent + name);
    }
}

//树枝节点,也就是组合节点
class Company{
    private String name;
    //部门相当于根节点
    private Department root;

    public Company(String name) {
        this.name = name;
        this.root = new Department(name);
    }

    public void add(Components components){
        root.add(components);
    }
    public void remove(Components components){
        root.remove(components);
    }

    public void display(){
        System.out.println("Company Structure");
        //从1开始,以适配指定的缩进格式
        root.display(0);
    }
}

7.6.7总结

  • 组合模式

  • 优点:可以通过组合多个对象形成对象组合,然后再增加新的功能或行为,只需要对组合对象进行操作

  • 总结:是一种通过将对象组合成树形结构,提供了灵活且统一的方式来处理单个对象和对象组合

  • 场景:需要构建具有部分-整体层次结构的场景,比如组织架构管理、文件系统的文件和文件夹组织文章来源地址https://www.toymoban.com/news/detail-800290.html

到了这里,关于笨蛋学设计模式结构型模式-组合模式【12】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 笨蛋学设计模式结构型模式-适配器模式【7】

    7.1.1概念 ​ 适配器模式是指将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类,能够在一起工作。基本上也就是通过增加一个中间层来解决,而适配器扮演的角色恰恰就是这个中间层。 7.1.2场景 ​ 在我们生活中可以看见的

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

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

    2024年02月15日
    浏览(50)
  • c#设计模式-结构型模式 之 组合模式

            组合模式又名部分整体模式,是一种 结构型设计模式 ,是用于把一组相似的对象当作一个 单一的对象 。组合模式 依据树形结构来组合对象 ,用来表示部分以及整体层, 它可以让你将对象组合成树形结构,并且能 像使用独立对象一样使用它们 。 这种模式定义

    2024年02月07日
    浏览(41)
  • 【地铁上的设计模式】--结构型模式:组合模式

    什么是组合模式 组合模式是一种结构型设计模式,将对象组合成树形结构,以表示部分整体的层次结构,让用户对单个对象和组合对象的使用具有一致性。 在组合模式中,抽象构件定义了一个统一的接口,用于管理所有对象,叶子节点和组合节点都实现了该接口。叶子节点

    2024年02月02日
    浏览(41)
  • Java23种设计模式-结构型模式之组合模式

    组合模式 (Composite Pattern):将 对象组合成树状结构 以表示“ 部分-整体 ”层次结构,同时保持对单个对象和组合对象的一致性操作,主要目的是简化客户端代码,因为它可以统一处理单个对象和组合对象。 通常包含以下几个角色: 角色1. 抽象组件 (Component):声明了 组

    2024年04月26日
    浏览(41)
  • Java设计模式之结构型-组合模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、菜单遍历  五、总结  组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。 角色 描述

    2024年02月16日
    浏览(51)
  • 设计模式--------结构型模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构

    2024年02月13日
    浏览(49)
  • 结构型设计模式——桥接模式

    桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。 桥接模式 (Bridge) 是一种结构型设计模式, 可将 抽象 部分与 实现 部分 分离 ,使它们都可以独立的变化。如果一个系统需要在构件的抽象化角色和具体化角色之间增加更

    2024年02月07日
    浏览(49)
  • 设计模式之结构型模式

    本文已收录于专栏 《设计模式》   大话设计模式主要分为三部分,第一部分是创建型模式,第二部分是结构型模式,第三部分是行为型模式。至于为什么要分为这三部分,我的理解是创建型是用于创建对象的而结构型是发生在类与类之间的关系是比较宏观的,比如说组合

    2024年02月11日
    浏览(40)
  • 结构型设计模式——外观模式

    有句话说这个世界就是个草台班子,只不过排面做的好看而已,里面都是一包糠。这句话来形容外观模式非常准确,外观模式又叫门面模式,顾名思义一个系统我不管你里面有多复杂有多少屎山代码,我只要求你提供的接口好用,简单就行,即门面要有排面!用专业的话讲是

    2024年01月22日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包