组合模式--设计模式解析与实战(关爱名 何红辉)笔记

组合模式--也称为部分整体模式,它将一组相似的对象看作一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与集合之间的差别。

郭神的http://blog.csdn.net/guolin_blog/article/details/9153753

定义:将对象组合成树形结构以表示 部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

使用场景: 1表示对象的部分-整体层次结构时。

     2从一个整体中能够独立出部分模块或功能的场景

例子: 公司

行政部           研发部           公司

行政部        研发部 


或者               文件

文件夹  文件

例子代码:

public abstract class Dir {
    /**
     * 声明一个List存储文件夹下所有元素
     */
    protected List<Dir> dirs=new ArrayList<>();
    private String name;//当前文件或文件夹名

    public Dir(String name){
        this.name=name;
    }
    /**
     * 添加一个文件或文件夹
     * @param dir
     */
    abstract void addDir(Dir dir);
    /**
     * 删除一个文件或文件夹
     * @param dir
     */
    abstract void removeDir(Dir dir);
    /**
     * 清空文件夹下所有元素
     */
    abstract void clear();
    /**
     * 获取文件夹下所有的文件或子文件夹
     */
    abstract List<Dir> getFiles();
    /**
     * 输出文件夹目录结构
     */
    abstract void print();
    /**
     * 获取文件或文件夹名
     */
    public String getName(){
        return  name;
    }

}
public class File extends Dir {
    public File(String name) {
        super(name);
    }

    @Override
    void addDir(Dir dir) {
        throw new UnsupportedOperationException("文件对象不支持改操作");
    }

    @Override
    void removeDir(Dir dir) {
        throw new UnsupportedOperationException("文件对象不支持改操作");
    }

    @Override
    void clear() {
        throw new UnsupportedOperationException("文件对象不支持改操作");
    }

    @Override
    List<Dir> getFiles() {
        throw new UnsupportedOperationException("文件对象不支持改操作");
    }

    @Override
    void print() {
        System.out.println(getName());
    }
}
public class Folder extends Dir {
    public Folder(String name) {
        super(name);
    }

    @Override
    void addDir(Dir dir) {
        dirs.add(dir);
    }

    @Override
    void removeDir(Dir dir) {
        dirs.remove(dir);
    }

    @Override
    void clear() {
        dirs.clear();
    }

    @Override
    List<Dir> getFiles() {
      return  dirs;
    }

    @Override
    void print() {
        System.out.println(getName() + "(");
        Iterator<Dir> iterator = dirs.iterator();
        while (iterator.hasNext()){
            Dir dir = iterator.next();
            dir.print();
            if (iterator.hasNext())
                System.out.println(",");
        }
        System.out.println(")");
    }
}
public class Client {
    public void main(String args[]){
        //
        Dir diskC=new Folder("c");

        diskC.addDir(new File("ImageYanbin.png"));
        //c盘下有个子目录
        Dir dirWin=new Folder("window");
        dirWin.addDir(new File("window.exe"));
        diskC.addDir(dirWin);

        //打印出文件结构
        diskC.print();
    }
}

一个典型的树状嵌套模式,就是组合模式

andorid源码中: View 和ViewGroup的嵌套组合, 

p367 安全的设计模式

总结

组合模式时通过继承实现的,这样的做法牺牲了类的单一原则,缺少弹性。

优点:可以清楚的定义分层次的复杂对象, 表示对象的全部或部分层次,它让高层模块忽略了层次的差异,方便对整个层次结构进行控制

   高层模块可以一致地使用一个组合结构或其中的单个对象,不必关心处理的是单个对象还是组合结构,简化了高层模块的代码。

组合结构为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和枝干对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

缺点:

在新增构件时不好对枝干中的构件类型进行限制,不能依赖类型系统来施加这些约束,因为在大多数情况下,他们都来自于相同的抽象层,此时,可以使用类型检查来实现,此实现过程较复杂。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值