当前位置:首页 > 科技  > 软件

一文彻底搞明白组合模式

来源: 责编: 时间:2024-05-09 09:20:49 270观看
导读本篇讲解Java设计模式中的组合模式,分为定义、模式应用前案例、结构、模式应用后案例、适用场景、模式可能存在的困惑和本质探讨7个部分。定义组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式

本篇讲解Java设计模式中的组合模式,分为定义、模式应用前案例、结构、模式应用后案例、适用场景、模式可能存在的困惑和本质探讨7个部分。b6X28资讯网——每日最新资讯28at.com

定义

组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户对单个对象和复合对象的使用具有一致性。b6X28资讯网——每日最新资讯28at.com

在新的分类方式中,组合模式被划分至类之间的交互类别中,其简化的是调用方与具备树结构的一组对象之间的交互,具体通过一致性的行为实现b6X28资讯网——每日最新资讯28at.com

b6X28资讯网——每日最新资讯28at.com

模式应用前案例

下面以一个典型的文件和目录为例来进行说明,先来看一下未应用组合模式之前的代码实现。b6X28资讯网——每日最新资讯28at.com

public class File {//文件结构    private final String name;    public File(String name) {        this.name = name;    }    public void display() {        System.out.println("File: " + this.name);    }}public class Directory {//目录结构    private String name;    private final List<File> files;    private final List<Directory> directories;    // 初始化方法    public Directory(String name){        this.name = this.name;        this.files = new ArrayList<>();        this.directories = new ArrayList<>();    }    // 添加子节点    public void addFile(File file){        this.files.add(file);    }    // 添加子目录    public void addDirectory(Directory directory) {        this.directories.add(directory);    }    public void display(){        //System.out.println("Directory:"+this.name);        for(File file : this.files){            file.display();        }        for (Directory dir : this.directories) {            dir.display();        }    }}public class Client {//调用方代码    public static void main(String[] ars){        Directory root= new Directory("Root");        File file1=new File("file1.txt");        File file2=new File("file2.txt");        root.addFile(file1);        root.addFile(file2);        Directory subDirecory =new Directory ("Subdirectory");        File file3 = new File("file3.tx");        File file4 = new File("file4.tx");        subDirecory.addFile(file3);        subDirecory.addFile(file4);        root.addDirectory(subDirecory);        root.display();    }}

我们知道,文件和目录两者是一个大的树结构中的节点。在上面未使用组合模式的代码中,文件和目录都有自己定义的方法。这样在构建一个多层树结构的过程中,复杂度会提升。b6X28资讯网——每日最新资讯28at.com

结构

b6X28资讯网——每日最新资讯28at.com

组合模式的示例代码如下。b6X28资讯网——每日最新资讯28at.com

public interface Component {    void operation();    void add(Component component);    void remove(Component component);    Component Display(int index);}public class Leaf implements Component{    private String name;    public Leaf(String name) {        this.name = name;    }    @Override    public void operation() {        System.out.println("Leaf: " + name + " operation()");    }    @Override    public void add(Component component) {        throw new UnsupportedOperationException("Leaf cannot have children");    }    @Override    public void remove(Component component) {        throw new UnsupportedOperationException("Leaf cannot remove children");    }    @Override    public Component Display(int index) {        throw new UnsupportedOperationException("Leaf cannot get child");    }}public interface Component {    void operation();    void add(Component component);    void remove(Component component);    Component Display(int index);}public class Client {    public static void main(String[] args) {        // 创建叶子节点        Component leaf1 = new Leaf("LeafA");        Component leaf2 = new Leaf("LeafB");        Component leaf3 = new Leaf("LeafC");        // 创建复合节点        Component composite = new Composite("CompositeX");        composite.add(leaf1);        composite.add(leaf2);        // 创建另一个复合节点,并添加之前的复合节点和新的叶子节点        Component root = new Composite("Root");        root.add(composite);        root.add(leaf3);        // 执行操作        root.operation();    }}

模式应用后案例

上面文件与目录的案例,使用组合模式之后的代码实现如下。b6X28资讯网——每日最新资讯28at.com

public interface IComponent {//接口    void display();}public class File implements IComponent{//文件实现    private final String name;    public File(String name) {        this.name = name;    }    @Override    public void display() {        System.out.println("File: " + this.name);    }}public class Directory implements IComponent{//目录实现    private String name;    private final List<IComponent> children;    // 初始化方法    public Directory(String name){        this.name = this.name;        this.children = new ArrayList<>();    }    // 添加子节点    public void addComponent(IComponent component){        this.children.add(component);    }    // 显示目录内容    @Override    public void display() {       //System.out.println("Directory: " + this.name);        for (IComponent child : this.children) {            child.display();        }    }}public class Client {//调用方代码    public static void main(String[] ars){        Directory root= new Directory("Root");        File file1 = new File("file1.txt");        File file2 = new File ("file2.txt");        root.addComponent(file1);        root.addComponent(file2);        Directory subDirectory =new Directory ("Subdirectory");        File file3 = new File("file3.txt");        File file4 = new File("file4.txt");        subDirectory.addComponent(file3);        subDirectory.addComponent(file4);        root.addComponent(subDirectory);        root.display();    }}

在上述代码中,由于树的结构使用一个接口和实现的家族来实现,这样树的结构中所有类的行为都是一致的,简化了编码时的复杂度。b6X28资讯网——每日最新资讯28at.com

适用场景

当需求中出现的一系列概念或对象,它们之间存在部分-整体的层次结构或共同构成一颗树的结构时,就可以考虑使用组合模式。b6X28资讯网——每日最新资讯28at.com

模式可能存在的困惑

困惑1:组合模式中的“组合”,与“组合优于继承”中的“组合”,有什么关联?b6X28资讯网——每日最新资讯28at.com

两者都代表了一种关系。前者的“组合”指的是将一系列对象按照层次化结构进行组织。而后者的“组合”指的是两个对象之间的聚合或组合关系,以此来取代类之间继承关系。b6X28资讯网——每日最新资讯28at.com

本质

组合模式的本质在于提供了一种机制来处理对象之间的部分-整体关系,并且通过统一接口来简化调用方使用复杂层次结构时可能遇到的问题。b6X28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87479-0.html一文彻底搞明白组合模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 大营销抽奖系统,DDD开发要如何建模?

下一篇: 开发者对 React 19 Beta 发布感到困惑

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top