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

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

相关推荐
望获linux1 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
JosieBook1 小时前
【Java编程动手学】使用IDEA创建第一个HelloJava程序
java·开发语言·intellij-idea
Thomas_YXQ1 小时前
Unity3D DOTS场景流式加载技术
java·开发语言·unity
summer夏1231 小时前
2025.07 做什么
java·android studio
钢铁男儿1 小时前
C# 委托(调用带引用参数的委托)
java·mysql·c#
Apex Predator1 小时前
windows安装maven环境
java·maven
Bug退退退1231 小时前
RabbitMQ 工作模式
java·分布式·rabbitmq
很小心的小新2 小时前
12、jvm运行期优化
java·开发语言·jvm·笔记
小莫分享3 小时前
github 镜像节点
java
链上Sniper3 小时前
智能合约状态快照技术:实现 EVM 状态的快速同步与回滚
java·大数据·linux·运维·web3·区块链·智能合约