设计模式(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):装饰器模式

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

相关推荐
坐吃山猪4 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫5 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao5 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区6 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT7 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy7 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss9 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续9 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben0449 小时前
ReAct模式解读
java·ai