先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”
/** * 抽象组件 */ public interface Component { void operation(); } /** * 叶子组件 */ interface Leaf extends Component{ } /** * 容器组件 */ interface Composite extends Component{ }
public interface AbstractFile { void killVirus(); } class ImageFile implements AbstractFile{ private String name; public ImageFile(String name) { super(); this.name = name; } @Override public void killVirus() { System.out.println("图像文件"+name+"进行查杀"); } } class TextFile implements AbstractFile{ private String name; public TextFile(String name) { super(); this.name = name; } @Override public void killVirus() { System.out.println("文本文件"+name+"进行查杀"); } } class VideoFile implements AbstractFile{ private String name; public VideoFile(String name) { super(); this.name = name; } @Override public void killVirus() { System.out.println("视频文件"+name+"进行查杀"); } } class Folder implements AbstractFile{ private String name; private List<AbstractFile> list = new ArrayList<AbstractFile>(); public Folder(String name) { super(); this.name = name; } public void add(AbstractFile file){ list.add(file); } public void remove(AbstractFile file){ list.remove(file); } public AbstractFile getChildr(int index){ return list.get(index); } @Override public void killVirus() { System.out.println("文件夹"+name+"进行查杀"); for(AbstractFile file:list){ file.killVirus(); } } }
测试:
public class Client { public static void main(String[] args) { AbstractFile f2,f3,f4,f5; Folder f1 = new Folder("我的收藏"); f2 = new ImageFile("mm.jpg"); f3 = new TextFile("123.txt"); f1.add(f2); f1.add(f3); Folder f11 = new Folder("我的电影"); f4 = new VideoFile("笑傲江湖.avi"); f5 = new VideoFile("神雕侠侣.mp4"); f11.add(f4); f11.add(f5); f1.add(f11); f1.killVirus(); } }
什么情况下使用组合模式
引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”
时间: 2024-10-31 00:08:08