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

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

相关推荐
java1234_小锋几秒前
Java高频面试题:Redis里什么是缓存击穿、缓存穿透、缓存雪崩?
java·redis·缓存
me832几秒前
【Java】踩坑实录:Spring Boot + Nginx 本地部署404终极排查:从80端口被占用到配置生效全流程
java·spring boot·nginx
6+h3 分钟前
【Spring】AOP核心之原始对象与代理对象
java·python·spring
君爱学习4 分钟前
SpringCloud-微服务拆分
java
礼拜天没时间.9 分钟前
力扣热题100实战 | 第25期:K个一组翻转链表——从两两交换到K路翻转的进阶之路
java·算法·leetcode·链表·递归·链表反转·k个一组翻转链表
y = xⁿ23 分钟前
【从零开始学习Redis|第四篇】从底层理解缓存问题:雪崩、击穿、穿透与一致性设计
java·redis·学习·缓存
江湖有缘26 分钟前
本地化JSON 处理新方案:基于 Docker的JSON Hero部署全记录
java·docker·json
御坂10101号40 分钟前
「2>&1」是什么意思?半个世纪的 Unix 谜题
java·数据库·bash·unix
鱼骨不是鱼翅1 小时前
个人简历面试复习-----设计模式篇(一)
设计模式
Java基基1 小时前
Spring让Java慢了30倍,JIT、AOT等让Java比Python快13倍,比C慢17%
java·开发语言·后端·spring