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

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

相关推荐
invicinble1 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟1 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖1 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707533 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.3 小时前
Day06——权限认证-项目集成
java
瑶山3 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy3 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_818732063 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
2501_941982053 小时前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信