设计模式之组合模式

composite

场景:(杀毒软件等)

把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对

象和整体对象。

 

抽象构件(Component)角色: 定义了叶子和容器构件的共同点

– 叶子(Leaf)构件角色:无子节点

– 容器(Composite)构件角色: 有容器特征,可以包含子节点

package com.xiaoqiang.gof23.structureModel.composite;

/**
 * @author xiaoqiang
 * <p>
 * 抽象组件
 */
public interface Component {
    void operation();
}



/**
 * 叶子组件
 */
interface Leaf extends Component {

}



//容器组件
interface Composite extends Component {
    void add(Component c);

    void remove(Component c);

    Component get(int index);

}

 

 

具体的杀毒软件实现

package com.xiaoqiang.gof23.structureModel.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xiaoqiang
 * @date $(DATE)-$(TIME)
 * <p>
 * 抽象构建
 */
public interface AbstractFile {
    void killVirus();

}
//叶子节点构建
class ImageFile implements AbstractFile {

    private String name;

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

    @Override
    public void killVirus() {
        System.out.println("图像文件:"+name+",进行查杀");
    }
}


class TextFile implements AbstractFile {

    private String name;

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

    @Override
    public void killVirus() {
        System.out.println("文本文件:"+name+",进行查杀");
    }
}

class VideoFile implements AbstractFile {

    private String name;

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

    @Override
    public void killVirus() {
        System.out.println("视频文件:"+name+",进行查杀");
    }
}

//容器组件  构建
class Folder implements AbstractFile {

    private String name;
    private List<AbstractFile> list = new ArrayList<>();

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

    public void add(AbstractFile file) {
        list.add(file);
    }

    public void remove(AbstractFile file) {
        list.remove(file);
    }

    public AbstractFile getChild(int index) {
        return list.get(index);
    }

    @Override
    public void killVirus() {
        System.out.println("文件夹"+name+",进行查杀");
        for (AbstractFile abstractFile : list) {
//            天然的递归
            abstractFile.killVirus();
        }
    }
}

 

 

客户端

package com.xiaoqiang.gof23.structureModel.composite;

/**
 * @author xiaoqiang
 * @date $(DATE)-$(TIME)
 */
public class Client {
    public static void main(String[] args) {
        Folder f1;
        AbstractFile f2, f3, f4, f5;
        f1 = new Folder("我的收藏");
        f2 = new ImageFile("我的相片.jpg");
        f3 = new TextFile("Hello.txt");
        f1.add(f2);
        f1.add(f3);

        Folder f11 = new Folder("电影");
        f4 = new VideoFile("神雕侠侣.avi");
        f5 = new VideoFile("天龙八部.avi");
        f11.add(f4);
        f11.add(f5);

        f1.add(f11);

//        f2.killVirus();

        f1.killVirus();
    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值