首页 > 其他分享 >每日总结之设计模式:组合模式

每日总结之设计模式:组合模式

时间:2023-11-09 09:15:38浏览次数:35  
标签:总结 组合 void AbstractFile System fileName add 设计模式 public

一、什么是组合模式

组合模式也成为整体部分模式,是一种结构型设计模式。它将对象组合成树形的层次结构,用来表示“整体-部分”的关系。通过组合模式,我们可以使用相同的方式处理单个对象和多个对象组合。

二、角色组成

  • 组件(Component):定义组合模式中所有对象共有的方法和属性。
  • 叶子节点(Leaf):叶子节点对象,也是组合中没有子节点的对象。
  • 组合节点(Composite):表示组合中的容器对象,该对象包含其他子节点。

    三、优缺点
    优点:

    通过组合模式,可以使客户端统一处理单个对象和组合对象,并且不用区分类型,简化了客户端代码的复杂性。
    在无需修改现有的代码情况下,可以很容易地增减新的组件类型,更加灵活。
    组合对象和单个对象之间的一致性接口可以使代码更易复用
    缺点:

    可能限制组件的类型:组合模式要求组件和叶子节点具有相同的接口,这可能会限制组件的类型。例如,所有的组件都必须实现相同的操作,即使某些组件并不需要这些操作。
    对某些操作的不支持:在组合模式中,对于某些操作,可能只有叶子节点能够支持,而组合对象不能够支持。这可能需要在设计时进行权衡。
    可能增加系统复杂性:虽然组合模式可以简化客户端代码,但在另一方面,它也引入了新的类和关系,可能增加了系统的复杂性。在一些简单的情况下,使用组合模式可能会显得过于繁琐。
    四、应用场景
    4.1 生活场景
    古代皇帝:皇帝治理国家不可能具体到某一个人,所以设置了很多机构,比如三省六部,这些机构下面又有很多小的组织,它们共同治理这个国家。
    公司:一个公司下面有很多小部门,每个部门下面又分好几个组,有可能再细点每个组又分为职业不同的人(前端、测试、开发、运维)。
    文件:比如C盘、D盘下面有很多文件夹,文件夹里面又有很多文件或文件夹。
    4.2 java场景
    HashMap:putAll()传入的是Map对象,Map就是一个组件,而HashMap就是一个组合节点,HashMap中的Node节点就是叶子节点。同理,ArrayList对象也有addAll()方法。
    Java AWT和SWING:对于Button和Checkbox是叶子节点,Container是组合节点。
    五、代码实现
    下面以算数表达式为例,解释一下组合模式。我们可以把算数表达式看作是一个树状结构,由操作符和操作数组成。

    组件(Component):Expression
    叶子节点(Leaf):AddOperator、MulOperator、Number
    组合节点(Composite):Operator

    [实验任务一]:组合模式

    用透明组合模式实现教材中的“文件夹浏览”这个例子。

  • 实例代码如下
  • //AbstractFile.java
    public abstract class AbstractFile
    {
        public abstract void add(AbstractFile element);
        public abstract void remove(AbstractFile element);
        public abstract void display();
    }
     
     
    public class Client
    {
        public static void main(String a[])
        {
            AbstractFile obj1,obj2,obj3,obj4;
            Folder plate1,plate2,plate3;
            obj1=new ImageFile("a.jpg");
            obj2=new TextFile("b.txt");
            plate1=new Folder("Image_Text");
            plate1.add(obj1);
            plate1.add(obj2);
     
            obj3=new VideoFile("c.mp4");
            plate2=new Folder("Image_Video");
            plate2.add(obj1);
            plate2.add(obj3);
     
            obj4=new ImageFile("d.jpg");
            plate3=new Folder("Image_Text_Video_Folder");
            plate3.add(plate1);
            plate3.add(plate2);
            plate3.add(obj4);
     
            plate3.display();
     
        }
    }
     
    import java.util.*;
     
    public class Folder extends AbstractFile
    {
        private String fileName;
        private ArrayList<AbstractFile> fileList=new ArrayList();
        public Folder(String filename)
        {
            this.fileName=new String();
            this.fileName=filename;
        }
        public void add(AbstractFile element)
        {
            fileList.add(element);
            System.out.println("add Folder");
        }
        public void remove(AbstractFile element)
        {
            fileList.remove(element);
            System.out.println("remove Folder");
        }
        public void display()
        {
            System.out.println(fileName);
            for(Object object:fileList)
            {
                ((AbstractFile)object).display();
            }
            System.out.println("****Folder display****");
        }
    }
     
    public class ImageFile extends AbstractFile
    {
        private String fileName;
        public ImageFile(String filename)
        {
            this.fileName=new String();
            this.fileName=filename;
        }
        public void add(AbstractFile element)
        {
            System.out.println("add ImageFile");
        }
        public void remove(AbstractFile element)
        {
            System.out.println("remove ImageFile");
        }
        public void display()
        {
            System.out.print(fileName);
            System.out.println(" ImageFile");
        }
    }
     
    public class TextFile extends AbstractFile
    {
        private String fileName;
        public TextFile(String filename)
        {
            this.fileName=new String();
            this.fileName=filename;
        }
        public void add(AbstractFile element)
        {
            System.out.println("add TextFile");
        }
        public void remove(AbstractFile element)
        {
            System.out.println("remove TextFile");
        }
        public void display()
        {
            System.out.print(fileName);
            System.out.println(" TextFile");
        }
    }
     
    public class VideoFile extends AbstractFile
    {
        private String fileName;
        public VideoFile(String filename)
        {
            this.fileName=new String();
            this.fileName=filename;
        }
        public void add(AbstractFile element)
        {
            System.out.println("add VideoFile");
        }
        public void remove(AbstractFile element)
        {
            System.out.println("remove VideoFile");
        }
        public void display()
        {
            System.out.print(fileName);
            System.out.println(" VideoFile");
        }
    }

     

标签:总结,组合,void,AbstractFile,System,fileName,add,设计模式,public
From: https://www.cnblogs.com/lxh-666/p/17818910.html

相关文章

  • pytest + yaml 框架 -58.运行报告总结summary.json
    前言用例运行结束后,在本地生成summary.json文件,总结运行结果。v1.5.1版本更新内容:1.解决参数化,中文在控制台输出问题2.保存用例结果summary.json保存用例结果summary.json命令行执行用例pytest运行结束,在当前目录生成summary.json文件,内容如下{"base_url":"http......
  • 常用设计模式大全
    1.设计模式设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件......
  • 每日总结
    今日收获赶了赶数据库实验报告的进度;复习了英语六级相关内容;准备周六的比赛;好吧,还收获了许多的BUG~明天预计希望课程顺利一些;完成软件设计实验报告;继续写数据库实验报告;......
  • 【django开发】知识经验总结共50页md文档。今日分享:django配置和数据库操作详解
    Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原......
  • 每日总结20231108
    代码时间(包括上课)6h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周三,上午上的是软件构造,讲的是交互和测试,具体的交互内容包括和测试的方式包括。2、今天下午参加了一个电气院的用电安全知识竞赛。3、今天晚上打算复习复习数学,毕竟马上要考研。......
  • 11.8每日总结
    今天看公众号,有大神分析了这样的一篇文章:一键生成前端UI,公司90%项目UI都靠它搞定地址:https://mp.weixin.qq.com/s/UhmLwVeZ0jwZORur8XD2MQ并且关注了GPT最新的发布会,好慌张,GPT这是要告诉所有研发大模型的都不要研发了,用他的接口就可以了。......
  • 第十一周课堂总结
    6.1I/O重定向 打开一个终端0,输入date命令,会显示当前时间。上述命令将date的输出结果重定向到一个普通文件。接着再打开一个终端1,将终端0的date输出结果重定向到终端1. 改变描述符为2的文件的输出方向,date命令是正确的,执行结果在终端中显示,输入命令是错误的,执行结果标准输......
  • 今日总结11.8
    实验1熟悉常用的Linux操作和Hadoop操作1.实验目的Hadoop运行在Linux系统上,因此,需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作,为顺利开展后续其他实验奠定基础。2.实验平台(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);(2)Hadoop版本:3.1.3。3.......
  • 类的组合与继承
    oop的三大特性就是封装、继承、多态性。其中「继承」的目的其实是实现「软件重用」。我们希望在做程序的时候可以尽量的利用以前的代码来减少的们的工作量,这就是所谓「重用」。但是实现软件重用的方式却不只有「继承」一种,本文将整理包括「继承」在内的两种软件重用方式。对......
  • 设计模式-原型模式
    原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创......