03-JAVA设计模式-组合模式

组合模式

什么是组合模式

组合模式(Composite Pattern)允许你将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构,并且能像单独对象一样使用它们。

组合模式使用场景

把部分和整体的关系用树形结构来表示,从而是客户端可以使用统一的方式处理部分对象和整体对象。

组合模式核心

抽象构件(Component)角色:定义了叶子和容器构件的共同特点

叶子(Leaf)构件角色:无子节点

容器(Composite)构件角色:有容器特征,可以包含子节点

组合模式工作流程分析

  • 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,是的用户在使用是可以一致性的对待容器和叶子
  • 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也抱恨这个方法的成员,并调用执行,其中使用了递归调用的机制对整个结构进行处理。

代码实现结构

Component.java

java 复制代码
// 抽象构件
public interface Component {
    // 相同行为操作
    void operation();
}

Leaf.java

java 复制代码
// 叶子
public class Leaf implements Component {
    @Override
    public void operation() {
        System.out.println("叶子单独操作");
    }
}

Composite.java

java 复制代码
import java.util.ArrayList;
import java.util.List;

// 容器节点
public class Composite implements Component{
    // 作为容器存储子节点信息
    private List<Component> components = new ArrayList<>();
    public Composite(List<Component> components) {
        this.components = components;
    }
    public List<Component> getComponents() {
        return components;
    }
    public void setComponents(List<Component> components) {
        this.components = components;
    }
    @Override
    public void operation() {
        System.out.println("容器构件操作");
        for (Component component : components) {
            // 递归执行叶子节点操作
            component.operation();
        }
    }
}

案例

模拟杀毒软件的架构设计

UML

实现代码

AbstractFile.java

java 复制代码
// 抽象组件
public interface AbstractFile {
    // 杀毒功能
    void killVirus();
}

ImagesFile.java

java 复制代码
// 图片类型文件
public class ImagesFile implements AbstractFile{
    private String name;

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

    @Override
    public void killVirus() {
        System.out.printf("图片类型文件-%s-进行扫毒%n",this.name);
    }
}

TxtFile.java

java 复制代码
// 文本类型文件
public class TxtFile implements AbstractFile{
    private String name;
    public TxtFile(String name) {
        this.name = name;
    }
    @Override
    public void killVirus() {
        System.out.printf("文本类型文件-%s-进行扫毒%n",this.name);
    }
}

VideoFile.java

java 复制代码
// 视频类型文件
public class VideoFile implements AbstractFile{
    private String name;
    public VideoFile(String name) {
        this.name = name;
    }
    @Override
    public void killVirus() {
        System.out.printf("视频类型文件-%s-进行扫毒%n",this.name);
    }
}

Floder.java

java 复制代码
import java.util.ArrayList;
import java.util.List;

// 容器构件:目录
public class Floder implements AbstractFile{
    private String name;
    // 子节点
    private List<AbstractFile> lists = new ArrayList<AbstractFile>();
    public Floder(String name, List<AbstractFile> lists) {
        this.name = name;
        this.lists = lists;
    }
    @Override
    public void killVirus() {
        System.out.printf("扫描当前目录-%s%n",this.name);
        for(AbstractFile abstractFile : lists){
            abstractFile.killVirus();
        }
    }
}

TestClient.java

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class TestClient {
    public static void main(String[] args) {
        AbstractFile file1 = new TxtFile("花无缺.TXT");
        AbstractFile file2 = new ImagesFile("花无缺.png");
        AbstractFile file3 = new ImagesFile("花无缺.avi");
        List<AbstractFile> list = new ArrayList<AbstractFile>();
        list.add(file1);
        list.add(file2);
        list.add(file3);
        Floder floder = new Floder("huawuque",list);

        AbstractFile file4 = new TxtFile("小鱼儿.TXT");
        AbstractFile file5 = new ImagesFile("小鱼儿.png");
        AbstractFile file6 = new ImagesFile("小鱼儿.avi");
        List<AbstractFile> list1 = new ArrayList<AbstractFile>();
        list1.add(file4);
        list1.add(file5);
        list1.add(file6);
        Floder floder2 = new Floder("xuaiyuer",list1);

        List<AbstractFile> list3 = new ArrayList<AbstractFile>();
        list3.add(floder);
        list3.add(floder2);

        Floder floder3 = new Floder("绝代双骄",list3);

        floder3.killVirus();
    }
}

执行结果

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

相关推荐
韩师学子--小倪41 分钟前
fastjson与gson的toString差异
java·json
Drawing stars44 分钟前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
nbsaas-boot1 小时前
SQL Server 存储过程开发规范(公司内部模板)
java·服务器·数据库
行百里er1 小时前
用 ThreadLocal + Deque 打造一个“线程专属的调用栈” —— Spring Insight 的上下文管理术
java·后端·架构
玄〤1 小时前
黑马点评中 VoucherOrderServiceImpl 实现类中的一人一单实现解析(单机部署)
java·数据库·redis·笔记·后端·mybatis·springboot
J_liaty2 小时前
Spring Boot拦截器与过滤器深度解析
java·spring boot·后端·interceptor·filter
亲爱的非洲野猪2 小时前
Java锁机制八股文
java·开发语言
rgeshfgreh2 小时前
C++字符串处理:STL string终极指南
java·jvm·算法
Zoey的笔记本3 小时前
「支持ISO27001的GTD协作平台」数据生命周期管理方案与加密通信协议
java·前端·数据库
lpfasd1233 小时前
Spring Boot 4.0.1 时变更清单
java·spring boot·后端