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. Maven(2)-坐标和依赖

    本文简要介绍Maven里面的坐标(coodinate)以及maven依赖管理(Dependency) 一.坐标 先来个截图: 在上图peoject栏目有groupId,artifactId,versi ...

  2. bash批量处理

    [root@azure_dbm1_s1 scripts]# more slave_1062_stop.sh #/bin/bash slave_num=`mysql -e "show slav ...

  3. gradle项目搭建

    一.gradle安装 1.安装JDK,这个就不用说了 2.下载gradle发布文件,下载地址:http://gradle.org/gradle-download/可以下载完整版或者简洁版都可以 3.解 ...

  4. C#SqlDataReader的用法

    string sqljn = "select [序号],[品名],[电压等级],[单位],[型号],[规格],[红本价格] FROM [book].[dbo].[View_wjprice]& ...

  5. 时空上下文视觉跟踪(STC)算法

    论文原文以及Matlab代码下载 算法概述 而STC跟踪算法基于贝叶斯框架,根据跟踪目标与周围区域形成的的时空关系,在图像低阶特征上(如图像灰度和位置)对目标与附近区域进行了统计关系建模.通过计算置信 ...

  6. nginx实现带参数目录域名重定向二级域名方法

    本文章介绍了关于nginx实现带参数目录域名重定向二级域名方法,有需要学习的朋友可参考一下. 下面的代码是基于nginx的子目录301到其他域名(URL)的规则.作用是例如访问http://www.p ...

  7. 一 ThreadLocal

    (1)  Threadlocal定义: 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它 ...

  8. elasticsearch2.x插件之一:kibana

    介绍: 要说kibana,就不得不先说一下logstash.这里呢,先要讲个故事.故事是开头是这样的,Logstash早期曾经自带了一个特别简单的logstash-web用来查看ES中的数据,其功能太 ...

  9. 六种获取配置properties文件的方法

    总结一下六种获取配置properties文件的方法,代码如下: package com.xujingyang.test ; import java.io.BufferedInputStream ; i ...

  10. unreal3控制台窗口属性调整

    在windows平台上,unreal3的console窗口类是FOutputDeviceConsoleWindows 启动时,它可以从XXXGame.ini中读取诸如窗口大小之类的属性,具体的代码在 ...