设计模式学习笔记——组合(Composite)模式

@(设计模式)[设计模式, 组合模式, composite]

  • 设计模式学习笔记组合Composite模式

    • 基本介绍
    • 组合案例
      • 类图
      • 实现代码
        • Entry抽象类
        • File类
        • Directory类
        • FileTreatmentException类
        • 测试类
        • 运行结果
    • 组合模式中的角色
        • Leaf树叶
        • Composite复合物
        • Component
        • Client
      • 类图

基本介绍

组合模式能够使容器与内容具有一致性,创造出递归结构。比如文件夹和文件,树形结构中的叶子节点和枝干节点。都可以用组合模式实现。

组合案例

类图

实现代码

Entry抽象类

package com.pc.composite.example;/*** 条目抽象类* Created by Switch on 2017-02-21.*/
public abstract class Entry {/*** 获取名字** @return 名字*/public abstract String getName();/*** 获取占用空间** @return 占用空间*/public abstract int getSize();/*** 添加** @param entry 条目对象* @return 返回文件夹对象* @throws FileTreatmentException 文件处理异常*/public Entry add(Entry entry) throws FileTreatmentException {throw new FileTreatmentException("只有文件夹才能添加条目!");}/*** 使用默认前缀,显示目录条目*/public void printList() {printList("");}/*** 指定前缀,显示目录条目** @param prefix 前缀*/protected abstract void printList(String prefix);@Overridepublic String toString() {return this.getName() + " (" + this.getSize() + ")";}
}

File类

package com.pc.composite.example;/*** 文件类* Created by Switch on 2017-02-21.*/
public class File extends Entry {/*** 文件名*/private String name;/*** 文件占用空间*/private int size;/*** 构造方法,传入文件名和文件占用空间** @param name 文件名* @param size 文件占用空间*/public File(String name, int size) {this.name = name;this.size = size;}@Overridepublic String getName() {return this.name;}@Overridepublic int getSize() {return this.size;}@Overrideprotected void printList(String prefix) {System.out.println(prefix + "/" + this);}
}

Directory类

package com.pc.composite.example;import java.util.ArrayList;
import java.util.List;/*** 文件夹类* Created by Switch on 2017-02-21.*/
public class Directory extends Entry {/*** 文件夹名*/private String name;/*** 文件夹中的条目集合*/private List<Entry> entries = new ArrayList<>();/*** 构造方法,传入文件夹名** @param name 文件夹名*/public Directory(String name) {this.name = name;}@Overridepublic String getName() {return this.name;}@Overridepublic int getSize() {int size = 0;for (Entry entry : entries) {size += entry.getSize();}return size;}@Overridepublic Entry add(Entry entry) {this.entries.add(entry);return this;}@Overrideprotected void printList(String prefix) {System.out.println(prefix + "/" + this);for (Entry entry : entries) {// 打印文件夹下的文件列表,以文件夹前缀,文件名作为前缀entry.printList(prefix + "/" + this.name);}}
}

FileTreatmentException类

package com.pc.composite.example;/*** 文件处理异常* Created by Switch on 2017-02-21.*/
public class FileTreatmentException extends RuntimeException {public FileTreatmentException() {}public FileTreatmentException(String message) {super(message);}
}

测试类

package com.pc.composite.example.test;import com.pc.composite.example.Directory;
import com.pc.composite.example.File;
import com.pc.composite.example.FileTreatmentException;
import org.junit.Test;/*** Entry Tester.** @author Switch* @version 1.0*/
public class EntryTest {/*** 测试微型文件系统*/@Testpublic void testEntry() {try {System.out.println("添加文件和文件夹:");System.out.println("Making root entries...");Directory rootDir = new Directory("root");Directory binDir = new Directory("bin");Directory etcDir = new Directory("etc");Directory usrDir = new Directory("usr");rootDir.add(binDir);rootDir.add(etcDir);rootDir.add(usrDir);binDir.add(new File("java", 5000));binDir.add(new File("javac", 10000));rootDir.printList();System.out.println();System.out.println("接着添加文件和文件夹:");System.out.println("Making user entries...");Directory switchvov = new Directory("switchvov");Directory kity = new Directory("kity");Directory tom = new Directory("tom");Directory bob = new Directory("bob");usrDir.add(switchvov);usrDir.add(kity);usrDir.add(tom);usrDir.add(bob);switchvov.add(new File("readme.txt", 1000));switchvov.add(new File("hello.txt", 400));kity.add(new File("find.sh", 5000));tom.add(new File("rehash.sh", 4000));tom.add(new File("index.html", 15400));rootDir.printList();} catch (FileTreatmentException e) {e.printStackTrace();}}
}

运行结果

添加文件和文件夹:
Making root entries...
/root (15000)
/root/bin (15000)
/root/bin/java (5000)
/root/bin/javac (10000)
/root/etc (0)
/root/usr (0)接着添加文件和文件夹:
Making user entries...
/root (40800)
/root/bin (15000)
/root/bin/java (5000)
/root/bin/javac (10000)
/root/etc (0)
/root/usr (25800)
/root/usr/switchvov (1400)
/root/usr/switchvov/readme.txt (1000)
/root/usr/switchvov/hello.txt (400)
/root/usr/kity (5000)
/root/usr/kity/find.sh (5000)
/root/usr/tom (19400)
/root/usr/tom/rehash.sh (4000)
/root/usr/tom/index.html (15400)
/root/usr/bob (0)

组合模式中的角色

Leaf(树叶)

表示”内容”的角色。在该角色中不能放入其他对象。在案例中,由File类扮演此角色。

Composite(复合物)

表示容器的角色。可以在其中放入Leaf角色和Composite角色。在案例中,由Directory类扮演此角色。

Component

使Leaf角色和Composite角色具有一致性的角色。Composite角色是Leaf角色和Composite角色的父类。在案例中,由Entry类扮演此角色。

Client

使用Composite模式的角色。在案例中,由测试类扮演此角色。

Composite模式的类图如下图所示。在该图中,可以将Composite角色与它内部的Component角色(即Leaf角色或Composite角色)看成是父亲与孩子们的关系。getChild方法的作用是从Component角色获取这些”孩子们”。

类图

GitHub:DesignPatternStudy

——————参考《图解设计模式》

设计模式学习笔记——组合(Composite)模式相关推荐

  1. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  2. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  3. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  4. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  5. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  6. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  7. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  8. 设计模式学习笔记——访问者(Visitor)模式

    设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...

  9. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

最新文章

  1. linux 脚本continue,shell中的break和continue
  2. 程序间数据共享与传递(1):EXPORT/IMPORT、SAP/ABAP Memory
  3. jvm调优:GC日志格式
  4. Exchange环境搭建心得
  5. 性能优化之数据库和数据源连接池配置
  6. 前端学习(3283):立即执行函数二
  7. 谷歌浏览器设置定位_Chrome如何设置允许所有网站跟踪我的地理位置
  8. 【[NOI2005]瑰丽华尔兹】
  9. 百度盘搜失效?这款网盘搜索神器万万别错过!
  10. python设置窗体标题_Python3 tkinter基础 TK title 设置窗体的标题
  11. 【JOURNAL】《题虾壶》
  12. SAP-PP后台配置(第二部分)
  13. 20190912每日一句
  14. 【背包问题】基于matlab萤火虫算法求解背包问题【含Matlab源码 1440期】
  15. 支持英特尔独立显卡的OpenVINOTM 2022.2新版本来啦
  16. Ant Design select下拉框突然拉长
  17. 柏力纪德:网店开店之后怎么运营
  18. 淘宝商品采集上架拼多多店铺(无货源数据采集接口,拼多多商品详情数据,淘宝商品详情数据)接口代码对接教程
  19. 用手机对电脑进行远程关机
  20. Python numpy实现二维数组和一维数组拼接

热门文章

  1. Debian8 Linux上安装SSH服务器并配置sshd_config文件启用root ssh登录
  2. GNS3模拟器中关于创建vtp时,内存空间不足问题的解决
  3. 解ns方程_流体动力学NS方程的哲学缺陷
  4. 数据脱敏和加密_Apache ShardingSphere数据脱敏全解决方案详解
  5. spring cloud之Feign的使用
  6. leetcode 旋转数组
  7. 函数式编程 -- 函子(Functor)
  8. 项目使用ts辅助_我如何建立辅助项目并在第一周获得31,000名用户
  9. 机器学习算法(二):基于决策数的分类预测
  10. ubuntu16.04备份和恢复系统