• 设计模式之——Composite模式


    composite模式又叫做组合模式/复合模式。

    它是一种能够使容器与内容具有一致性,创造出递归结构的模式。

    示例程序是列出文件夹以及其内部文件与文件夹一览的功能:

    image

    可以由示例图看出,有一个电影文件夹里面有两个文件夹,一个是正常,一个是你懂得。

    在正常文件夹里面有三个电影,分别是泰坦尼克号,终结者和钢铁侠。

    而在你懂得文件夹里面有两部电影和一个葵司文件夹,两部电影分别是列车.avi和苍老师.avi,而葵司文件里面同样也有两部电影,家庭教师.avi和隔壁小姐姐.avi。

    下面是示例代码:

    • SomeThing 文件夹和文件的父类
    package site.wangxin520.gof.composite;
    
    /**
     * 所有东西的一个父类
     * @author wangXgnaw
     *
     */
    public abstract class SomeThing {
    
        //名字
        public abstract String getName();
        
        //大小、所占空间
        public abstract int getSize();
        
        //输出打印自己,文件的话,就打印里面所有文件,和自己。如果是文件的话,打印自己
        public abstract void print();
    }
    • Directroy 文件夹类
    package site.wangxin520.gof.composite;
    
    import java.util.ArrayList;
    
    /**
     * 文件夹的类
     * @author wangXgnaw
     *
     */
    public class Directory extends SomeThing{
    
        private String name;
        private int size;
        
        private ArrayList<SomeThing> arr;
        
        /**
         * 文件夹构造函数,传入文件夹名
         * @param name
         */
        public Directory(String name) {
            this.name=name;
            arr=new ArrayList<>();
        }
        
        @Override
        public String getName() {
            return name;
        }
    
        @Override
        public int getSize() {
            size=0;
            for (SomeThing someThing : arr) {
                size+=someThing.getSize();
            }
            return size;
        }
    
        
        /**
         * 递归打印出本文件夹名字和文件夹内部的文件或者文件夹的名字
         */
        @Override
        public void print() {
            System.out.println("文件夹名:"+name+"     大小为:"+getSize());
            for (SomeThing someThing : arr) {
                someThing.print();
            }
        }
        
        /**
         * 文件夹添加东西
         * @param someThing 这里的something既可以是文件夹,又可以是文件
         */
        public void addSomeThing(SomeThing someThing){
            arr.add(someThing);
        }
    
    }
    • File 文件类
    package site.wangxin520.gof.composite;
    
    /**
     * 文件类
     * @author wangXgnaw
     *
     */
    public class File extends SomeThing{
    
        private String name;
        private int size;
        
        public File(String name,int size){
            this.name=name;
            this.size=size;
        }
        
        @Override
        public String getName() {
            return name;
        }
    
        @Override
        public int getSize() {
            return size;
        }
    
        /**
         * 打印出本文件名
         */
        @Override
        public void print() {
            System.out.println("文件:"+name+"["+size+"]");
        }
    
    }
    • Test测试类
    package site.wangxin520.gof.composite;
    
    /**
     * 组合模式的测试类
     * @author wangXgnaw
     *
     */
    public class Test {
        public static void main(String[] args) {
            
            Directory moive=new Directory("电影");
            
            Directory normal=new Directory("正常的");
            Directory heihei=new Directory("你懂得");
            
            moive.addSomeThing(normal);
            moive.addSomeThing(heihei);
            
            normal.addSomeThing(new File("终结者.rmvb", 850));
            normal.addSomeThing(new File("泰坦尼克号.rmvb", 770));
            normal.addSomeThing(new File("钢铁侠.rmvb", 1200));
        
            heihei.addSomeThing(new File("列车.avi", 3200));
            Directory kuiSi=new Directory("葵司");
            kuiSi.addSomeThing(new File("葵司-家庭老师.avi", 3000));
            kuiSi.addSomeThing(new File("葵司-隔壁小姐姐.avi", 3000));
            heihei.addSomeThing(new File("苍老师.avi", 1800));
            heihei.addSomeThing(kuiSi);
        
            moive.print();
        }
    }
    • 控制台输出结果为:
    文件夹名:电影     大小为:13820
    文件夹名:正常的     大小为:2820
    文件:终结者.rmvb[850]
    文件:泰坦尼克号.rmvb[770]
    文件:钢铁侠.rmvb[1200]
    文件夹名:你懂得     大小为:11000
    文件:列车.avi[3200]
    文件:苍老师.avi[1800]
    文件夹名:葵司     大小为:6000
    文件:葵司-家庭老师.avi[3000]
    文件:葵司-隔壁小姐姐.avi[3000]

  • 相关阅读:
    PHP面向对象之原型(trait)
    PHP面向对象之命名空间
    Javascript中的Copy()函数
    六、unique_lock取代lock_guard
    五、互斥量
    四、创建和等待多个线程
    三、线程传参
    二、线程的启动与结束 join与detach
    HTTP:常见状态码
    HTTP:简述URL、URN和URI
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7678736.html
Copyright © 2020-2023  润新知