混合模式(整体-部分模式):将对象组合成树形结构以表示“部分-整体”的层次结构,使单个对象(叶)和复合对象(枝)的使用具有一致性
核心:使对叶和枝的操作具备一致性,①简化客户端的使用,②节点自由增加
角色:
- 抽象节点(Component):
- (安全模式下)定义形成组合的叶和枝之间的共性部分(枝作为个体相关的操作) --> 需要使用枝的组合相关操作时需转型
- (透明模式下)在共性部分外,还会提供枝的组合相关的操作 --> 对叶子对象使用枝的组合相关的功能时,可能出现错误
- 树枝节点(Composite):整体部分(也存在作为个体时的功能),组合叶子节点和下一层树枝节点
① 存在作为组合相关的操作
② 存在作为个体相关的操作
- 叶子节点(Leaf):个体部分,只实现个体相关的操作
使用场景:对象层次具备组合和个体的树形关系,且客户端希望忽略组合对象(枝)和个体对象(叶)的差异时,(即:枝对象同时具备组合部分的功能和个体部分的功能)
安全模式#
Copy
public abstract class Directory {
protected String name;
protected Directory(String name) {
this.name = name;
}
public abstract void show(String prefix);
}
+ View Code
Copy
public class Folder extends Directory{
List<Directory> directorys = new ArrayList<>();
public Folder(String name) {
super(name);
}
@Override
public void show(String prefix) {
System.out.println(prefix + "Folder : " + name);
}
public void addDirectory(Directory directory){
directorys.add(directory);
}
public void remoceDirectory(Directory directory){
directorys.remove(directory);
}
public List<Directory> getDirectorys(){
return directorys;
}
public void listDirectorys(String prefix){
for(Directory directory : directorys){
if(directory instanceof Folder) {
directory.show(prefix);
((Folder) directory).listDirectorys(prefix + " ");
}else {
directory.show(prefix);
}
}
}
}
Copy
public class File extends Directory{
public File(String name) {
super(name);
}
@Override
public void show(String prefix) {
System.out.println(prefix + "File : " + name);
}
}
透明模式#
+ View Code
Copy
public abstract class Directory {
protected String name;
protected Directory(String name) {
this.name = name;
}
public abstract void show(String prefix);
public abstract boolean isFolder();
public abstract void addDirectory(Directory directory);
public abstract void removeDirectory(Directory directory);
public abstract List<Directory> getDirectorys();
public abstract void listDirectorys(String prefix);
}
+ View Code
Copy
public class Folder extends Directory {
List<Directory> directorys = new ArrayList<>();
public Folder(String name) {
super(name);
}
@Override
public void show(String prefix) {
System.out.println(prefix + "Folder : " + name);
}
@Override
public boolean isFolder() {
return true;
}
public void addDirectory(Directory directory){
directorys.add(directory);
}
public void removeDirectory(Directory directory){
directorys.remove(directory);
}
public List<Directory> getDirectorys(){
return directorys;
}
public void listDirectorys(String prefix){
for(Directory directory : directorys){
if(directory instanceof Folder) {
directory.show(prefix);
((Folder) directory).listDirectorys(prefix + " ");
}else {
directory.show(prefix);
}
}
}
}
+ View Code
Copy
public class File extends Directory {
public File(String name) {
super(name);
}
@Override
public void show(String prefix) {
System.out.println(prefix + "File : " + name);
}
@Override
public boolean isFolder() {
return false;
}
@Override
public void addDirectory(Directory directory) {
System.out.println("Not folder, do nothing!");
}
@Override
public void removeDirectory(Directory directory) {
System.out.println("Not folder, do nothing!");
}
@Override
public List<Directory> getDirectorys() {
return null;
}
@Override
public void listDirectorys(String prefix) {
System.out.println("Not folder, do nothing!");
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Huawei LiteOS基于Cortex-M4 GD32F4平台移植
· mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处