设计模式学习笔记——组合(Composite)模式
设计模式学习笔记——组合(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)模式相关推荐
- 设计模式学习笔记——解释器(Interpreter)模式
设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...
- 设计模式学习笔记——命令(Command)模式
设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...
- 设计模式学习笔记——代理(Proxy)模式
设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...
- 设计模式学习笔记——状态(State)模式框架
设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...
- 设计模式学习笔记——备忘录(Memento)模式
设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...
- 设计模式学习笔记——观察者(Observer)模式
设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...
- 设计模式学习笔记——外观(Facade)模式
设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...
- 设计模式学习笔记——访问者(Visitor)模式
设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...
- 设计模式学习笔记——装饰(Decorator)模式
设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...
最新文章
- linux 脚本continue,shell中的break和continue
- 程序间数据共享与传递(1):EXPORT/IMPORT、SAP/ABAP Memory
- jvm调优:GC日志格式
- Exchange环境搭建心得
- 性能优化之数据库和数据源连接池配置
- 前端学习(3283):立即执行函数二
- 谷歌浏览器设置定位_Chrome如何设置允许所有网站跟踪我的地理位置
- 【[NOI2005]瑰丽华尔兹】
- 百度盘搜失效?这款网盘搜索神器万万别错过!
- python设置窗体标题_Python3 tkinter基础 TK title 设置窗体的标题
- 【JOURNAL】《题虾壶》
- SAP-PP后台配置(第二部分)
- 20190912每日一句
- 【背包问题】基于matlab萤火虫算法求解背包问题【含Matlab源码 1440期】
- 支持英特尔独立显卡的OpenVINOTM 2022.2新版本来啦
- Ant Design select下拉框突然拉长
- 柏力纪德:网店开店之后怎么运营
- 淘宝商品采集上架拼多多店铺(无货源数据采集接口,拼多多商品详情数据,淘宝商品详情数据)接口代码对接教程
- 用手机对电脑进行远程关机
- Python numpy实现二维数组和一维数组拼接
热门文章
- Debian8 Linux上安装SSH服务器并配置sshd_config文件启用root ssh登录
- GNS3模拟器中关于创建vtp时,内存空间不足问题的解决
- 解ns方程_流体动力学NS方程的哲学缺陷
- 数据脱敏和加密_Apache ShardingSphere数据脱敏全解决方案详解
- spring cloud之Feign的使用
- leetcode 旋转数组
- 函数式编程 -- 函子(Functor)
- 项目使用ts辅助_我如何建立辅助项目并在第一周获得31,000名用户
- 机器学习算法(二):基于决策数的分类预测
- ubuntu16.04备份和恢复系统