设计模式之组合模式

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
初次看上去,好像组合模式和外观模式有点像,不都是把一堆对象封装到一起嘛。不过多研究几次下来就会发现,两者有很大的不同,外观模式注重于高层接口的封装调用,而组合模式更像是一个神奇口袋,里面可以装各种东西,当然也可以再装口袋,然后可以一直装下去。最后拿走的也只是这个口袋,而不用管口袋里究竟装了多少。为了更容易理解,这里还是以最典型的文件系统来说吧。

整个结构就相当于一棵树,根目录也相当于一个总的文件夹,里面装了文件A(叶节点)与文件夹B(枝节点),文件夹B又装了文件C与文件夹D,当然文件夹D也可以再装其他文件或者文件夹。而我们操作时候不会去关心它是文件还是文件夹,统一做打开、关闭等操作。具体实现如下:
1.基本对象(文件)与组合对象(文件夹)的统一接口
public interface FileDir {
    public void open();
    public void close();
    public void add(FileDir fileDir);
    public void remove(FileDir fileDir);
}
2.基本对象-文件
public class File implements FileDir{
    @Override
    public void open() {
        System.out.println("打开文件");
    }
    @Override
    public void close() {
        System.out.println("关闭文件");
    }
    //add与remove方法对文件类无意义,但须与文件夹保持接口一致,此为透明方式
    @Override
    public void add(FileDir fileDir) {
    }
    @Override
    public void remove(FileDir fileDir) {
    }
}
3.组合对象-文件夹
public class Dir implements FileDir{
   private  List<FileDir> list=new ArrayList<FileDir>();
    @Override
    public void open() {
        System.out.println("打开文件夹");
    }
    @Override
    public void close() {
        System.out.println("关闭文件夹");
    }
    @Override
    public void add(FileDir fileDir) {
        list.add(fileDir);
    }
    @Override
    public void remove(FileDir fileDir) {
      list.remove(fileDir);
    }
}
4.客户端-测试类
public class Test {
    public static void main(String[] args){
        //操作单个文件
        FileDir A=new File();
        A.open();
        A.close();
        //操作单个文件夹
        FileDir dir=new Dir();
        dir.open();
        //操作含有多个文件/夹的文件夹
        dir.add(A);  //装入文件
        FileDir B=new Dir();
        FileDir D=new Dir();
        FileDir C=new File();
        B.add(D);   //D文件夹装入B文件夹
        B.add(C);  //C文件装入B文件夹
        dir.add(B);  //B文件夹装入根目录
        dir.close();
    }
}
由上面的Demo可见,基本对象文件与组合对象文件夹都实现了统一接口FileDir ,而统一接口中也定义了对基本对象的操作,这样的好处是客户端操作时统一调用接口方法,而不用区分是基本对象还是组合对象,缺点是即使基本对象不需要操作基本对象的方法(如add与remove),也必须实现。此为透明方式。还有一种安全方式是统一接口不去实现操作基本对象的方法,而由组合对象自己去实现,好处是基本对象可以不用实现不需要的方法,缺点在于客户端调用时需要对基本对象与组合对象加以区分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值