组合模式

简介: 组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。


这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。


介绍



意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。


主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。


何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。


关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作数也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。


优点: 1、高层模块调用简单。 2、节点自由增加。


缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。


使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

注意事项:定义时为具体类。


代码实现


//文件类
public abstract class File {
    String name;
    public File(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public abstract void display();
}
//文件夹类
public class Folder extends File {
    private List<File> files;
    public Folder(String name) {
        super(name);
        files = new ArrayList<>();
    }
    /**
     * 【浏览文件夹中的文件】
     */
    @Override
    public void display() {
        for (File file : files) {
            file.display();
        }
    }
    /**
     * @param file
     * @return void
     * @desc 向文件夹中添加文件
     */
    public void add(File file) {
        files.add(file);
    }
    /**
     * @param file
     * @return void
     * @desc 从文件夹中删除文件
     */
    public void remove(File file) {
        files.remove(file);
    }
}
// 然后是三个文件类:TextFile.java、ImageFile.java、VideoFile.java
public class ImagerFile extends File {
    public ImagerFile(String name) {
        super(name);
    }
    public void display() {
        System.out.println("这是图像文件,文件名:" + super.getName());
    }
}
public class TextFile extends File {
    public TextFile(String name) {
        super(name);
    }
    @Override
    public void display() {
        System.out.println("这是文本文件,文件名:" + super.getName());
    }
}
public class VideoFile extends File{
    public VideoFile(String name) {
        super(name);
    }
    public void display() {
        System.out.println("这是影像文件,文件名:" + super.getName());
    }
}
//客户端
public class Client {
    public static void main(String[] args) {
        //总文件夹
        Folder zwjj = new Folder("总文件夹");
        //向总文件夹中放入三个文件:1.txt、2.jpg、1文件夹
        TextFile aText= new TextFile("a.txt");
        ImagerFile bImager = new ImagerFile("b.jpg");
        Folder cFolder = new Folder("C文件夹");
        zwjj.add(aText);
        zwjj.add(bImager);
        zwjj.add(cFolder);
        //向C文件夹中添加文件:c_1.txt、c_1.rmvb、c_1.jpg
        TextFile cText = new TextFile("c_1.txt");
        ImagerFile cImage = new ImagerFile("c_1.jpg");
        VideoFile cVideo = new VideoFile("c_1.rmvb");
        cFolder.add(cText);
        cFolder.add(cImage);
        cFolder.add(cVideo);
        //遍历C文件夹
        cFolder.display();
        //将c_1.txt删除
        cFolder.remove(cText);
        System.out.println("-----------------------");
        cFolder.display();
    }
}



相关文章
|
2月前
|
设计模式 缓存 算法
C#一分钟浅谈:组合模式与外观模式
【10月更文挑战第15天】本文介绍了面向对象设计模式中的组合模式和外观模式。组合模式通过树形结构表示“部分-整体”的层次关系,适用于文件系统、图形界面等场景;外观模式提供统一接口简化复杂系统的使用,适用于视频播放器等多模块系统。文章详细解释了这两种模式的基本概念、应用场景、实现方式及常见问题和解决方法,帮助读者更好地理解和应用。
43 9
|
7月前
|
存储 安全
结构型 组合模式
结构型 组合模式
33 0
|
前端开发
关于组合模式我所知道的
关于组合模式我所知道的
58 0
|
存储 设计模式 安全
结构型模式-组合模式
结构型模式-组合模式
94 0
|
设计模式
我学会了,组合模式
组合模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
112 0
我学会了,组合模式
|
安全 Java 容器
结构型:组合模式 Composite
主要内容有: 该模式的介绍,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的代码示例:熟悉该模式的代码长什么样子 该模式的优缺点:模式不是万金油,不可以滥用模式 该模式的应用案例:了解它在哪些重要的源码中被使用
168 0
|
设计模式 存储 人工智能
享元模式与组合模式(4)
享元模式与组合模式(4)
110 0
享元模式与组合模式(4)
|
存储
享元模式与组合模式(1)
享元模式与组合模式(1)
150 0
享元模式与组合模式(1)
|
存储
享元模式与组合模式(2)
享元模式与组合模式(2)
196 0
享元模式与组合模式(2)
|
存储 设计模式 Java
享元模式与组合模式(3)
享元模式与组合模式(3)
150 0
享元模式与组合模式(3)