设计模式——组合模式(文件夹与文件)

 本文首发于cdream的个人博客,点击获得更好的阅读体验!

欢迎转载,转载请注明出处。

本文简单介绍组合模式,以系统文件和文件夹为例。

image-20181223141136417

一、概述

定义:组合模式(Composite pattern)将对象整合到树状结构中来表示整体/部分的层次关系,在树状结构中包括对象和对象组合。组合模式能让客户用一致的方式处理个别对象的对象组合。

组合模式主要解决两个问题
1.部分-整体的层级结构以树状结构来表现
2.部分整体的层级结构中,对象和对象组合要以一致方式处理

二、结构

UML:

image-20181221071228741

主要角色:

抽象构件类Compnent):为所有对象定义了一个接口,无论是叶节点还是组合。

叶构件类(Leaf):继承了抽象构件类,但是没有子构件了,虽然继承了add,remove,getChildren方法,但是对于叶节点来说没什么意义,不过为了保持透明性,我们坚持这么做。

树枝构件类(Component):继承了抽象构件类,持有一个子构件类容器口。

三、系统文件目录

系统文件目录是一个典型的包括叶构件(文件)和树枝构件(文件夹)的组合模式。

image-20181221201327097

当然文件夹和文件操作上还是有区别的,不过,我在这里就让文件夹和文件都实现相同的接口,完成最理想的组合的组合模式——放弃安全性,追求透明性。

定义一个抽象接口,为了保证可以使用户不关心究竟是什么,所有文件/文件夹都要实现这个接口。

public abstract class FileInterface {     // 添加文件     void add(FileInterface file) {         throw new UnsupportedOperationException();     }      // 删除文件     void remove(String fileName) {         throw new UnsupportedOperationException();     }      // 获取文件     Set<FileInterface> getChildren() {         throw new UnsupportedOperationException();     }      // 获取文件名字     String getName(){         throw new UnsupportedOperationException();     }      // 获取文件描述     String getDescription(){         throw new UnsupportedOperationException();     };      // 运行程序     void run(){         throw new UnsupportedOperationException();     };  }

写一个文件夹类

public class Directory implements FileInterface {     private String name;     private String desc;     // 文件夹要持有文件列表     private Set<FileInterface> set = new HashSet<>();      public Directory(String name, String desc) {         this.name = name;         this.desc = desc;     }      @Override     public void add(FileInterface file) {         set.add(file);     }      @Override     public void remove(String fileName) {         
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信