设计模式(8):组合模式

一.组合模式场景

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

二.组合模式核心

  • 抽象组件(Component)角色:定义了叶子和容器组件的共同点;
  • 叶子组件(Leaf)角色:无子节点;
  • 容器组件(Composite)角色:有容器特征,可以包含子节点。

三.组合模式工作流程分析

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

四.使用组合模式模拟杀毒软件

1.抽象组件

java 复制代码
/**
 * 抽象组件--抽象文件对象
 */
public interface AbstractFile {
	/**
	 * 杀毒
	 */
	void killVirus();
}

2.叶子组件

java 复制代码
/**
 * 查杀  图像文件
 */
public class ImageFile implements AbstractFile{
	private String name;
	public ImageFile(String name) {
		this.name = name;
	}
	@Override
	public void killVirus() {
		System.out.println("---图形文件:"+name+"  进行查杀!");
	}
}
/**
 * 查杀  文本文件
 */
public class TextFile implements AbstractFile{
	private String name;
	public TextFile(String name) {
		this.name = name;
	}
	@Override
	public void killVirus() {
		System.out.println("---文本文件:"+name+"  进行查杀!");
	}
}
/**
 * 查杀  视频文件
 */
public class VideoFile implements AbstractFile{
	private String name;
	public VideoFile(String name) {
		this.name = name;
	}
	@Override
	public void killVirus() {
		System.out.println("---视频文件:"+name+"  进行查杀!");
	}
}

3.容器组件

java 复制代码
/**
 * 容器组件--文件夹
 */
class Foder implements AbstractFile{
	private String name;
	/**
	 * 定义容器,用来存放本容器构建下的子节点
	 */
	private List<AbstractFile> list=new ArrayList<AbstractFile>();
	
	public Foder(String name) {
		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();
		}
	}
}

4.组合模式调用

java 复制代码
public static void main(String[] args) {
   	/**
   	 * 我的文件
   	 *    我的头像.jpg
   	 *    hello.text
   	 *    我的视频
   	 *   	神雕侠侣	
   	 *   	射雕英雄传
   	 */
   	AbstractFile f2,f3,f4,f5;
   	Foder f1=new Foder("我的文件");
   	f2=new ImageFile("  我的头像.jpg");
   	f3 =new TextFile("  hello.text");
   	f1.add(f2);
   	f1.add(f3);
   	Foder f6=new Foder("我的视频");
   	f4=new VideoFile("  神雕侠侣");
   	f5=new VideoFile("  射雕英雄传");
   	f6.add(f4);
   	f6.add(f5);
   	f1.add(f6);
   	
   	f1.killVirus();
   	System.out.println("-------------------------");
   	f6.killVirus();
   }

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式(7):装饰器模式

设计模式持续更新中...

相关推荐
chuan.bai4 小时前
Java RAG 实战附录:qwen3 与 bge-m3 模型切换指南
java·人工智能·算法
SL_staff4 小时前
销售知识管理的断点分析与技术解法:从3天找话术到秒级检索
java·开源·github
荣码4 小时前
向量数据库选型:4种方案全测了,选错重来成本最高
java·python
rannn_1114 小时前
【力扣hot100】二叉树专题+总结
java·算法·leetcode·二叉树
摇滚侠5 小时前
《Docker技术入门与实战 第4版》阅读笔记 6 使用 Dockerfile 创建镜像 2
java·笔记·docker
余额瞒着我当琳5 小时前
C++--vector第二讲:手写 C++ STL:vector 源码剖析与迭代器失效分析
android·java·c++
资源大佬星 课it5 小时前
黑马 Java+AI新版V16零基础就业班视频课程百度网盘下载
java·开发语言·人工智能
二十雨辰5 小时前
[Java]-微服务面试题
java·开发语言·微服务
我命由我123455 小时前
Compose Codelab 学习 - Compose 中的基本布局
android·java·java-ee·kotlin·android studio·android-studio·android runtime
莫得感情 o6 小时前
并发 11 · 同步工具类
java·并发