Composite 设计模式?

在计算机的文件系统中,有“文件夹”的概念(在有些操作系统(Linux操作系统)中,也称为“目录”)。文件夹里面既可以放入文件,也可以放入其他文件夹(子文件夹)。在子文件夹中,一样地既可以放入文件,也可以放入子文件夹。可以说,文件夹是形成了一种容器结构、递归结构。

  • 结构模式:能够使容器与内容具有一致性,创造出递归结构的模式就是Composite模式。

  • 关注点:使用Composite模式可以使容器与内容具有一致性,也可以称其为多个和单个的一致性,即将多个对象结合在一起,当作一个对象进行处理。

理清职责

  • 到处存在的递归结构:
  1. 在视窗系统中,一个窗口可以含有一个子窗口,

    2.在文章的列表中,各列表之间可以相互嵌套,这也是一种递归结构。

    3.将多条计算机命令合并为一条宏命令时,如果使用递归结构实现宏命。

    4.树结构的数据结构都适用Composite模式。
  • 实现:演示文件夹 文件子项之间的层次关系

    名字===================>>>说明

    Entry || 抽象类,用来实现File类和Directory类的一致性

    File || 表示文件的类

    Directory || 表示文件夹的类

    FileTreatementException || 表示向文件中增加Entry时发生的异常的类

    Main || 测试程序行为的类

  • Add()方法的存在位置:

  1. 存在Entry 抛出异常。
  2. 存在Entry 中什么也不做。
  3. 声明在Entry中为抽象方法 不去实现。
  4. 直接定义在Directory类中,但是需要关注类型之间的转换。

UML

类图:

Code

  • Entry

···

public abstract class Entry {

/**
* 1. 文件名
* 2. 文件大小
* @return
*/
public abstract String getName();
public abstract int getSize(); /**
* Directory 增加条目
* File 不能增加条目
*/
public Entry add(Entry entry)throws FileTreatementException{
throw new FileTreatementException();
} public void printList(){
printList("");
} protected abstract void printList(String prefix); @Override
public String toString() {
return getName()+"("+getSize()+")";
}

}

···

  • File
public class File extends Entry {

    private String name;

    private int size;

    public File(String name, int size) {
this.name = name;
this.size = size;
} @Override
public String getName() {
return name;
} @Override
public int getSize() {
return size;
} @Override
protected void printList(String prefix) {
System.out.println(prefix+"/"+this);
}
}
  • Directory

public class Directory extends Entry { private String name; private List<Entry> directory=new ArrayList<>(); public Directory(String name) {
this.name = name;
} @Override
public Entry add(Entry entry) throws FileTreatementException {
directory.add(entry);
return this;
} @Override
public String getName() {
return name;
} /**
* getSize() | printList(String prefix)
*
* 都会递归去遍历下面可能存在的 目录或者文件的子项
*/ @Override
public int getSize() {
int size=0;
Iterator<Entry> it = directory.iterator();
while (it.hasNext()){
// 这里的Entry 可能是目录 也可能是文件
Entry next = it.next();
size+=next.getSize();
} return size;
} @Override
protected void printList(String prefix) {
// 这里的 prefix是一个引用 this将会调用tostring()方法 又会继续调用getName() getSize()方法
System.out.println(prefix+"/"+this);
Iterator<Entry> it = directory.iterator();
while(it.hasNext()){
// 这里的Entry 可能是目录 也可能是文件
Entry next = it.next();
next.printList(prefix+"/"+this);
}
}
}
  • FileTreatementException

public class FileTreatementException extends Exception { public FileTreatementException() {
} public FileTreatementException(String message) {
super(message);
}
}
  • 定义的目的结构:
start +++++++++++
/root(16000)
/root(16000)/bin(16000)
/root(16000)/bin(16000)/vi(1000)
/root(16000)/bin(16000)/notepaid(15000)
/root(16000)/temp(0)
/root(16000)/user(0)
  • MainT
public class MainT {

    public static void main(String[] args) throws FileTreatementException{

        System.out.println("start +++++++++++");

        Directory rootdir=new Directory("root");

        Directory bindir = new Directory("bin");
Directory tempdir = new Directory("temp");
Directory userdir = new Directory("user"); rootdir.add(bindir);
rootdir.add(tempdir);
rootdir.add(userdir); bindir.add(new File("vi",1000));
bindir.add(new File("notepaid",15000)); rootdir.printList();
}
}

Composite模式(组合设计模式)的更多相关文章

  1. Composite模式 组合模式

    Android的ViewGroup 和 View 的关系,即是采用组合模式 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件 ...

  2. 组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)

    组合模式(合成模式 COMPOSITE) 意图 将对象组合成树形结构以表示“部分-整体”的层次结构. Composite使得用户对单个对象和组合对象的使用具有一致性.   树形结构介绍 为了便于理解, ...

  3. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...

  4. 设计模式之Composite(组合)模式

    1.出现原因 1.在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即它们在充当对象的同时,又是其他对象的容器. 如何将“客户代码与复杂的对象容器结构”解耦(将这种组合容器对象设计成树形结构 ...

  5. 设计模式之美:Composite(组合)

    索引 意图 结构 参与者 适用性 缺点 效果 相关模式 实现 实现方式(一):在 Component 中定义公共接口以保持透明性但损失安全性. 意图 将对象组合成树形结构以表示 “部分-整体” 的层次 ...

  6. 使用C# (.NET Core) 实现组合设计模式 (Composite Pattern)

    本文的概念性内容来自深入浅出设计模式一书. 本文需结合上一篇文章(使用C# (.NET Core) 实现迭代器设计模式)一起看. 上一篇文章我们研究了多个菜单一起使用的问题. 需求变更 就当我们感觉我 ...

  7. 设计模式之Composite(组合)(转)

    Composite定义: 将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Comp ...

  8. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  9. Java 实现组合(Composite)模式

    类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...

随机推荐

  1. RenderMonkey基本使用方法

    http://www.cnblogs.com/mixiyou/archive/2009/10/05/1578208.html 楔子: 差不多从年中开始由于工作需要,开始研究Direct3D,这是继大二 ...

  2. mesos的zookeeper变更

    采用rpm方式安装你了mesos,碰到zookeeper(采用了cloudera的zookeeper)的IP地址变化了,肿么办? 在master机器中: /etc/mesos/zk进行编辑修改zk路径 ...

  3. JAVA中重写equals()方法为什么要重写hashcode()方法说明

    重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值.如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用 ...

  4. pip3 更改安装源

    经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解决被墙导致的装不上库的 ...

  5. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  6. MySQL Sending data导致查询很慢的问题详细分析

    这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...

  7. linux下将编译错误输出到一个文本文件

    linux下将编译错误输出到一个文本文件 command > filename 把把标准输出重定向到一个新文件中 command > > filename 把把标准输出重定向到一个文 ...

  8. SQL标量值函数:小写金额转大写

    我们日常开发业务系统中,作为统计报表中,特别是财务报表,显示中文金额经常遇到. 转换大小写的方法有很多,以下是从数据库函数方面解决这一问题. 效果如图: 调用:SELECT dbo.[Fn_Conve ...

  9. 用 R 画中国分省市地图

    用 R 画中国分省市地图 (2010-11-18 16:25:34) 转载▼ 标签: 中国地图 营销 杂谈 分类: 数据分析 用R 也可以做出漂亮的依参数变化的中国地图. 主要参考(http://co ...

  10. Entity Framework Code-First(6):Database Initialization

    Database Initialization: We have seen that Code First creates a database automatically in the Simple ...