GOF23之组合模式

一、核心作用:

------将对象组合成树形结构以表示部分-整体的层次结构
------组合模式使用户可以使用一致的方法处理单个对象和组合对象

二、常见应用场景:

1、操作系统的资源管理器
2、XML文件解析
3、Junit单元测试框架

三、组合模式角色分类:

  • 组合部件(Component):他是抽象结构,相当于根,定义了叶子和合成部件的共同点
  • 叶子(Leaf):在组合中,表示节点对象,无子节点
  • 合成部件、容器(Composite):有容器特征,可以包含子节点,表示自己还有孩子
    在这里插入图片描述

四、代码示例:

一、组合部件:
package com.hezeu.composite;

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

/**
* @Classname AbstractFile
* @Description TODO
* @Date 2020/2/23 下午 12:02
* @Created by 朱进博 [email protected]
*/
public interface AbstractFile {
        void killVirus();
}
二、合成(容器)部件:
class Folder implements AbstractFile{
        private String name;
        private List<AbstractFile> list = new ArrayList<>();

        public Folder(String name) {
                super();
                this.name = name;
        }

        public void add(AbstractFile file){
                list.add(file);
        }

        public void remove(AbstractFile file){
                list.remove(file);
        }

        public AbstractFile getChild(int index){
                return list.get(index);
        }
        @Override
        public void killVirus() {
                System.out.println("---文件夹:"+name+",进行查杀");
                for(AbstractFile file : list){
                        file.killVirus();
                }
        }
}


三、叶子部件:
class VideoFile implements AbstractFile{
        private String name;

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

        @Override
        public void killVirus() {
                System.out.println("---视频文件:"+name+",进行查杀");
        }
}
四、测试:
package com.hezeu.composite;

/**
* @Classname Client
* @Description TODO
* @Date 2020/2/23 下午 12:21
* @Created by 朱进博 [email protected]
*/
public class Client {
        public static void main(String[] args) {
                AbstractFile f2,f3,f4,f5;
                Folder f1 = new Folder("我的收藏");
                f2 = new ImageFile("头像.jpg");
                f3 = new TextFile("Hello.txt");
                f4 = new VideoFile("视频.mp4");
                f5 = new VideoFile("视频2.avi");

                f1.add(f2);
                f1.add(f5);
                f1.killVirus();
        }
}
结果如下:

在这里插入图片描述

五、组合模式的优缺点:

优点:

无需关心处理的是单个对象还是处理的组合的容器对象,实现容器之间的解耦,当有新部件时,易添加

缺点:

客户端需要花更多时间理清类之间的层次关系

感谢阅读,水平有限,如有错漏,还请不吝赐教

发布了11 篇原创文章 · 获赞 13 · 访问量 1297

猜你喜欢

转载自blog.csdn.net/weixin_44789225/article/details/104459034