设计模式(十一)----组合模式

目录

1.Composite模式

1.1 作用

1.2 示例程序

1.2.1 示例程序类图

1.2.2 Entry抽象类

1.2.3 File类

1.2.4 Directory类

1.2.5 Main类

1.3 Composite模式中的角色

1.4 其他特点


1.Composite模式

1.1 作用

   在操作系统中, 虽然文件夹与文件是不同类型的对象, 但它们都可以放入到文件夹中, 因此文件和文件夹有时也被系统称为"目录条目". 在目录条目中, 文件夹和文件被当作是同一种对象看待, 即一致性. 这种文件系统的结构就是一种容器结构,递归结构.

   Composite模式就是能够使容器和内容具有一致性, 创造出递归结构的模式.

1.2 示例程序

1.2.1 示例程序类图

1.2.2 Entry抽象类

//文件和文件夹的父类,目录条目抽象类
public abstract class Entry {
    public abstract String getName();//名字
    public abstract int getSize();//大小
    public abstract Entry add(Entry entry);//向文件夹内添加文件
    public void printList() {
        printList("");
    }
    public abstract void printList(String prefix);//前缀

    @Override
    public String toString() {
        return getName() + "(" + getSize() + ")";
    }
}

1.2.3 File类

//文件类
public class File extends Entry{
    private String name;
    public 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 Entry add(Entry entry) {//文件没有add功能,实现直接返回null
        return null;
    }

    @Override
    public void printList(String prefix) {
        System.out.println(prefix + "/" + this);
    }
}

1.2.4 Directory类

//文件夹类
//文件中可以有文件,也可以有更小的文件夹
public class Director extends Entry{
    private String name;
    private List<Entry> directory = new ArrayList<>();

    public Director(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {//文件夹的大小要把这个文件夹内的所有内容的大小加起来
        int size = 0;
        Iterator it = directory.iterator();
        while (it.hasNext()) {
            Entry entry = (Entry) it.next();
            size += entry.getSize();
        }
        return size;
    }

    @Override
    public Entry add(Entry entry) {
        directory.add(entry);
        return this;
    }

    @Override
    public void printList(String prefix) {//递归打印出文件夹中每个文件或文件夹
        System.out.println(prefix + "/" + this);
        Iterator it = directory.iterator();
        while (it.hasNext()) {
            Entry entry = (Entry) it.next();
            entry.printList(prefix + "/" + name);
        }
    }
}

1.2.5 Main类

public class Main {
    public static void main(String[] args) {
        System.out.println("Making root entries...");
        Director rootdir = new Director("root");
        Director bindir = new Director("bin");
        Director tmpdir = new Director("tmp");
        Director usrdir = new Director("usr");
        rootdir.add(bindir);
        rootdir.add(tmpdir);
        rootdir.add(usrdir);
        bindir.add(new File("vi",10000));
        bindir.add(new File("latex",20000));
        rootdir.printList();
    }
}

   输出:

1.3 Composite模式中的角色

  • Leaf(树叶): 表示内容的角色, 在该角色中不能放入其他对象. 上述的File类.
  • Composite(复合物): 表示容器的角色, 可以在其中放入Leaf和Composite角色. 上述的Directory类.
  • Component: 使Leaf角色和Composite角色具有一致性的角色, 即Component角色是Leaf角色和Composite角色的父类.
  • Client: 使用Composite模式的角色.
  • Composite模式的类图:

1.4 其他特点

  • 在程序世界中, 到处都存在递归结构和Composite模式.
    • 比如视窗系统中, 一个窗口可以含有一个子窗口
    • 可以将计算机命令合并为一条宏命令, 这条宏命令又可以作为另一个宏命令的子命令.

根据图解设计模式书籍进行整理.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值