结构型模式之组合模式composite

mac2024-05-11  33

组合模式composite

1.使用场景

把部分和整体的关系用树形结构表示,从而使客户端可以使用同一的方法处理部分对象和整体对象。 如:操作系统的资源管理器,XML文件解析

2.组合模式核心角色

抽象构建Component:定义了叶子构件器构件同特点 叶子构件Leaf:无子点 容器构件Composite:容器特征

3.工作流程

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

4.代码实现:模拟杀毒

/** * 模拟杀毒 * @author Administrator */ //抽象构建component角色 public interface AbstractFile { void antivirus();//杀毒 } //叶子Leaf角色 class TextFile implements AbstractFile{ private String name; public TextFile(String name) { super(); this.name = name; } @Override public void antivirus() { // TODO 自动生成的方法存根 System.out.println("--------对文件:"+name+"杀毒--------"); } } //叶子Leaf角色 class ImageFile implements AbstractFile{ private String name; public ImageFile(String name) { super(); this.name = name; } @Override public void antivirus() { // TODO 自动生成的方法存根 System.out.println("--------对文件:"+name+"杀毒--------"); } } //叶子Leaf角色 class VideoFile implements AbstractFile{ private String name; public VideoFile(String name) { super(); this.name = name; } @Override public void antivirus() { // TODO 自动生成的方法存根 System.out.println("--------对文件:"+name+"杀毒--------"); } } //容器Composite构件 class Folder implements AbstractFile{ private String name; private List<AbstractFile> list=new ArrayList<>(); public Folder(String name) { super(); this.name = name; } @Override public void antivirus() { // TODO 自动生成的方法存根 System.out.println("---对文件夹:"+name+"杀毒---"); for (AbstractFile file : list) { file.antivirus(); } } public void add(AbstractFile file) { list.add(file); } public void remove(AbstractFile file) { list.remove(file); } public AbstractFile getFile(int index) { return list.get(index); } } public class Client { public static void main(String[] args) { // TODO 自动生成的方法存根 AbstractFile f1,f2,f3,f4,f5,f6; f1=new TextFile("小说.txt"); f2=new ImageFile("苹果.jpg"); f3=new VideoFile("三国演义.mp4"); f4=new TextFile("特种兵.txt"); f5=new ImageFile("风景.jpg"); f6=new VideoFile("水浒传.mp4"); Folder folder=new Folder("我的资源"); Folder folder1=new Folder("电影"); Folder folder2=new Folder("小说"); Folder folder3=new Folder("图片"); folder.add(f1); folder.add(folder3); folder.add(folder2); folder.add(folder1); folder1.add(f6); folder1.add(f3); folder2.add(f1); folder2.add(f4); folder3.add(f5); folder3.add(f2); folder.antivirus(); } }

最新回复(0)