设计模式-组合模式

设计模式-组合模式

组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构,在组合模式中用户对单个对象和组合对象的使用具有一致性。

组合模式又分透明模式和安全模式两种
所谓透明模式是将组合相关的方法抽象到父类中,使叶节点和枝节点结构完全相同。但是叶节点的add()和remove()方法其实是冗余的,没有意义的。
安全模式就是将叶节点与枝节点区分开来,叶节点不用实现无用的方法。但是增加了客户端的耦合性,使用时需要判断类型。

class diagram
我们就拿 Linux ”一切皆文件“ 的文件系统举例
先定义抽象的文件接口

public abstract class File {
    protected String name;

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

    void display() {
        this.display(1);
    }

    abstract void add(File f);
    abstract void remove(File f);
    abstract protected void display(int depth);
}

目录实现类,作为枝节点

public class Directory extends File {

    List<File> children = new ArrayList<>();

    public Directory(String name) {
        super(name);
    }

    @Override
    void add(File f) {
        children.add(f);
    }

    @Override
    void remove(File f) {
        children.remove(f);
    }

    @Override
    protected void display(int depth) {
        System.out.println(StringUtils.repeat("-", depth) + this.name);
        for (File file : children) {
            file.display(depth + 1);
        }
    }
}

普通文件实现类,这是叶节点

public class CommonFile extends File {

    public CommonFile(String name) {
        super(name);
    }

    @Override
    void add(File f) {
        throw new RuntimeException("leaf node cannot add node");
    }

    @Override
    void remove(File f) {
        throw new RuntimeException("leaf node cannot remove node");
    }

    @Override
    protected void display(int depth) {
        System.out.println(StringUtils.repeat("-", depth) + this.name);
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        File d1 = new Directory("root");
        File d2 = new Directory("etc");
        File d3 = new Directory("local");
        File c1 = new CommonFile("zshrc");
        File d4 = new Directory("security");
        File c2 = new CommonFile("audit_user");

        d1.add(d2);
        d2.add(d3);
        d2.add(d4);
        d3.add(c1);
        d4.add(c2);

        d1.display();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值