组合-模式

处理树形结构,叶子节点和子树。如操作系统的文件 看作(叶子节点)/文件夹看作(子树);软件系统的菜单结构也是树形,具体选项看作(叶子节点)/二级菜单看作(子树)。
组合模式就是要为叶子节点和子树抽象出统一的接口,叶子节点进行具体操作,子树进行递归处理。
以文件系统为例。我要给某个路径下的所有文件进行杀毒。

为文件和文件夹抽象出一个公共抽象类AbstractFile

interface AbstractFile{
    public void add(AbstractFile abstractFile);
    public void remove(AbstractFile abstractFile);
    public void killVirus();
}

某个叶子节点,如文本文件

class TextFile implements AbstractFile{
    String name;

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

    @Override
    public void add(AbstractFile abstractFile) {
        System.out.println("我是文件,无添加方法");
    }

    @Override
    public void remove(AbstractFile abstractFile) {
        System.out.println("我是文件,无删除方法");
    }

    @Override
    public void killVirus() {
        System.out.println("我是Text文件,正在杀毒"+name);
    }
}

子树,充当容器。也就是文件夹

class Folder implements AbstractFile{
    ArrayList <AbstractFile> list=new ArrayList<AbstractFile>();
    @Override
    public void add(AbstractFile abstractFile) {
        System.out.println("我是文件夹,正在添加文件或文件夹");
        list.add(abstractFile);
    }

    @Override
    public void remove(AbstractFile abstractFile) {
        System.out.println("我是文件夹,正在删除文件或文件夹");
        list.remove(abstractFile);
    }

    @Override
    public void killVirus() {
        System.out.println("我是文件夹,无法杀毒");
        for (AbstractFile a:list){
            a.killVirus();
        }
    }
}

客户端调用

   public static void main(String[] args) {
//        创建一个D盘路径(子树)
        AbstractFile D=new Folder();
//        创建一个文本文件夹(子树)
        AbstractFile myText=new Folder();
//        文本文件夹下有语文课件,数学课件
        myText.add(new TextFile("语文课件"));   myText.add(new TextFile("数学课件"));
//       文本文件夹属于 D盘路径(子树)
        D.add(myText);
//        给D盘的文件杀毒,文件夹会递归找到文件
        D.killVirus();
    }

总结

核心就是忽略整体与部分的差异,客户端可以一致的对待,子树容器就去处理它的所以孩子,叶子节点就处理业务。直到递归完所有叶子节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值