zoukankan      html  css  js  c++  java
  • JAVA设计模式之【组合模式】

    组合模式
    	用面向对象的方式来处理树形结构
    	组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。
    	在组合模式中引入了抽象构件类Component,它是所有容器类和叶子类的公共父类。
    	角色
    		Component抽象构件
    			可以是接口或抽象类
    			为叶子构件和容器构件对象声明接口
    		Leaf叶子构件
    			叶子节点没有子节点
    		Composite容器构件
    			容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。
    
    

    杀毒软件案例

    1.抽象文件类

    package Composite;
    
    /**
     * Created by Jiqing on 2016/10/5.
     */
    abstract class AbstractFile {
        public abstract void add(AbstractFile file);
        public abstract void remove(AbstractFile file);
        public abstract AbstractFile getChild(int i);
        public abstract void killVirus();
    }
    
    

    2.Image文件类

    package Composite;
    
    /**
     * Created by Jiqing on 2016/10/5.
     */
    public class ImageFile extends AbstractFile{
        private String name;
        public ImageFile (String name) {
            this.name = name;
        }
    
        public void add(AbstractFile file) {
            System.out.println("对不起,不支持该方法!");
        }
    
        public void remove(AbstractFile file) {
            System.out.println("对不起,不支持该方法!");
        }
    
        public AbstractFile getChild(int i) {
            System.out.println("对不起,不支持该方法!");
            return null;
        }
    
        public void killVirus() {
            // 模拟杀毒
            System.out.println("----对图像文件'" + name + "'进行杀毒----");
    
        }
    
    }
    
    

    3.文本文件类

    package Composite;
    
    /**
     * Created by Jiqing on 2016/10/5.
     */
    public class TextFile extends AbstractFile{
        private String name;
        public TextFile (String name) {
            this.name = name;
        }
    
        public void add(AbstractFile file) {
            System.out.println("对不起,不支持该方法!");
        }
    
        public void remove(AbstractFile file) {
            System.out.println("对不起,不支持该方法!");
        }
    
        public AbstractFile getChild(int i) {
            System.out.println("对不起,不支持该方法!");
            return null;
        }
    
        public void killVirus() {
            // 模拟杀毒
            System.out.println("----对文本文件'" + name + "'进行杀毒----");
    
        }
    
    }
    

    4.视频文件类

    package Composite;
    
    /**
     * Created by Jiqing on 2016/10/5.
     */
    public class VideoFile extends AbstractFile{
        private String name;
        public VideoFile (String name) {
            this.name = name;
        }
    
        public void add(AbstractFile file) {
            System.out.println("对不起,不支持该方法!");
        }
    
        public void remove(AbstractFile file) {
            System.out.println("对不起,不支持该方法!");
        }
    
        public AbstractFile getChild(int i) {
            System.out.println("对不起,不支持该方法!");
            return null;
        }
    
        public void killVirus() {
            // 模拟杀毒
            System.out.println("----对视频文件'" + name + "'进行杀毒----");
    
        }
    
    }
    

    5.文件夹类

    package Composite;
    
    import java.util.ArrayList;
    
    /**
     * Created by Jiqing on 2016/10/5.
     */
    public class Folder extends AbstractFile{
        private ArrayList<AbstractFile> fileList = new ArrayList<AbstractFile>(); // 规定集合中成员类型
        private String name;
        public Folder(String name) {
            this.name = name;
        }
    
        public void add(AbstractFile file) {
            fileList.add(file);
        }
    
        public void remove(AbstractFile file) {
            fileList.remove(file);
        }
    
        public AbstractFile getChild(int i) {
            return (AbstractFile)fileList.get(i); // 强制转换为类型
        }
    
        public void killVirus() {
            System.out.println("****对文件夹'" + name + "'进行杀毒****"); // 模拟杀毒
            // 递归调用成员构件的杀毒方法
            for (Object obj :fileList) {
                ((AbstractFile)obj).killVirus();
            }
        }
    }
    
    

    6.客户端

    package Composite;
    
    /**
     * Created by Jiqing on 2016/10/5.
     */
    public class Client {
        public static void main(String args[]) {
            AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
            folder1 = new Folder("Jim的资料");
            folder2 = new Folder("图像文件");
            folder3 = new Folder("文本文件");
            folder4 = new Folder("视频文件");
    
            file1 = new ImageFile("小龙女.jpg");
            file2 = new ImageFile("张无忌.gif");
            file3 = new TextFile("九阴真经.txt");
            file4 = new TextFile("葵花宝典.doc");
            file5 = new VideoFile("笑傲江湖.rmvb");
    
            folder2.add(file1);
            folder2.add(file2);
            folder3.add(file3);
            folder3.add(file4);
            folder4.add(file5);
            folder1.add(folder2);
            folder1.add(folder3);
            folder1.add(folder4);
    
            folder1.killVirus();
        }
    }
    
    

    执行结果

    对文件夹'Jim的资料'进行杀毒
    对文件夹'图像文件'进行杀毒
    ----对图像文件'小龙女.jpg'进行杀毒----
    ----对图像文件'张无忌.gif'进行杀毒----
    对文件夹'文本文件'进行杀毒
    ----对文本文件'九阴真经.txt'进行杀毒----
    ----对文本文件'葵花宝典.doc'进行杀毒----
    对文件夹'视频文件'进行杀毒
    ----对视频文件'笑傲江湖.rmvb'进行杀毒----

  • 相关阅读:
    建议博客园搭个威客平台,可行的发展方向和盈利方向
    SQLServer DBA 三十问(第11~20题)
    sqlserver2000中nvarchar保存韩文乱码问题解决
    beginning Linux programming读书笔记(2)之shell编程
    IBM打狗问题
    Perl入门笔记2之第二章 标量数据
    linux面试大全
    结构体对齐详解
    Linux下静态链接库与动态链接库的区别
    Perl入门 笔记1之第一章简介
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/5932974.html
Copyright © 2011-2022 走看看