Java设计模式之组合模式

本文通过一个文件扫描的例子介绍Java设计模式中的组合模式。该模式允许客户端一致地处理单个对象和对象组合,使得用户可以忽略组合对象与单个对象的区别。文章详细展示了如何通过抽象类及其实现类来构建文件系统模型。

Java设计模式之组合模式


前言

引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”

下面我们用一个很常见的例子来学习组合模式,扫描文。这个文件可以是文件夹也可以是图片更可以是视频,其实文件夹里面可以有文件夹,图片,视频;

首先创建一个抽象类让文件,图片,视频都继承它

public abstract class BaseItem {
    public abstract void scan();
}

public class ImageItem extends BaseItem {
    private String name;

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

    @Override
    public void scan() {
        System.out.println("name :" + this.name + " image scan...");
    }
}

public class VideoItem extends BaseItem {
    private String name;

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

    @Override
    public void scan() {
            System.out.println("name " + 
            this.name + "video scan...");
    }
}

文件夹类比较特殊,他要维持一个集合,这个集合用来保存其他的子项目,可以是图片,视频或者其他文件夹;

public class FolderItem extends BaseItem {
private String name;

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

private List<BaseItem> list;

public boolean addItem(BaseItem item) {
    if (list == null) {
        list = new ArrayList<>();
    }
    return list.add(item);
}

@Override
public void scan() {
    System.out.println("start scan " + this.name + " file");

    if (list != null) {
        for (BaseItem item : list) {
            item.scan();
        }
       }
    }
}

最后我们来测试下

public class Main {
public static void main(String[] args) {
    FolderItem folderItem1 = new FolderItem("文件夹1");
    folderItem1.addItem(new ImageItem("image1"));
    folderItem1.addItem(new ImageItem("image2"));

    FolderItem folderItem2 = new FolderItem("文件夹2");
    folderItem2.addItem(new VideoItem("video1"));
    folderItem2.addItem(new VideoItem("video2"));
    folderItem2.addItem(folderItem1);
    folderItem2.scan();
    }
}

输出:
start scan 文件夹2 file
name video1video scan…
name video2video scan…
start scan 文件夹1 file
name :image1 image scan…
name :image2 image scan…

> 如果你觉得对你有帮助的话,你还可以看详细的demo哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值