基础结构(伪码):
package composite_mode; /** * 都是组件, 组件类型, 抽象组件 * 组合模式非oo组合, 当涉及到对树形结构的处理时, 首先考虑到组合模式 */ public interface Component { /** * 组件拥中的的方法 */ void operation(); } /** * 叶子组件(底下不包含其它) */ interface Leaf extends Component { } /** * 容器组件(拥有孩子节点) */ interface Composite extends Component { /** * 增加组件 */ void add(Component c); /** * 删除组件 */ void remove(Component c); /** * 根据下标, 获得指定的组件 */ Component getChild(int index); }
Demo:
文件类型:
package composite_mode; /** * 文件类型(抽象构建) */ public interface AbstractFile { /** * 杀毒 */ public void killVirus(); }
图片文件:
package composite_mode; /** * 图片文件 * 图片文件下不包含其它, 本为叶子组件 */ public class ImageFile implements AbstractFile { /** * 文件名 */ private String name; /** * 构造器(传入文件名) */ public ImageFile(String name) { this.name = name; } /** * 杀毒 */ @Override public void killVirus() { System.out.println("---图像文件: " + name + ",进行查杀!"); } }
文本文件:
package composite_mode; /** * 文本文件 * 文本文件下不包含其它, 本为叶子组件 */ public class TextFile implements AbstractFile { /** * 文件名 */ private String name; /** * 构造器(传入文件名) */ public TextFile(String name) { this.name = name; } /** * 杀毒 */ @Override public void killVirus() { System.out.println("---文本文件: " + name + ",进行查杀!"); } }
视频文件:
package composite_mode; /** * 视频文件 * 视频文件下不包含其它, 本为叶子组件 */ public class VideoFile implements AbstractFile { /** * 文件名 */ private String name; /** * 构造器(传入文件名) */ public VideoFile(String name) { this.name = name; } /** * 杀毒 */ @Override public void killVirus() { System.out.println("---视频文件: " + name + ",进行查杀!"); } }
文件夹:
package composite_mode; import java.util.ArrayList; import java.util.List; /** * 文件夹 * 文件夹下会包含其它, 本为容器组件 */ public class Folder implements AbstractFile { /** * 文件名 */ private String name; /** * 定义: 容器 * 用于文件夹下存放文件(存放子节点) */ private List<AbstractFile> list = new ArrayList<AbstractFile>(); /** * 构造器(传入文件名) */ public Folder(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(); } } }
测试类:
package composite_mode; public class Client { public static void main(String[] args) { //声明文件类型 AbstractFile f2, f3, f4, f5, f6; //创建f1文件夹 Folder f1 = new Folder("我的收藏"); //创建图片文件 f2 = new ImageFile("老高的大头像.jpg"); //创建文本文件 f3 = new TextFile("Hello.txt"); //f1文件夹里添加图片和文本 f1.add(f2); f1.add(f3); //创建f11文件夹 Folder f11 = new Folder("电影"); //创建视频文件 f4 = new VideoFile("aa.avi"); f5 = new VideoFile("bb.avi"); //f11文件夹里添加视频 f11.add(f4); f11.add(f5); //f1文件夹里添加f11文件夹 f1.add(f11); //f2.killVirus(); //对f1文件夹杀毒 f1.killVirus(); } }
执行结果:
---文件夹: 我的收藏,进行查杀! ---图像文件: 老高的大头像.jpg,进行查杀! ---文本文件: Hello.txt,进行查杀! ---文件夹: 电影,进行查杀! ---视频文件: aa.avi,进行查杀! ---视频文件: bb.avi,进行查杀!
谢谢声明出处!
转自: http://www.cnblogs.com/gscq073240/articles/7113201.html

浙公网安备 33010602011771号