您的位置:首页 > 其它

设计模式(二十七)------23种设计模式(19):组合模式

2017-12-13 17:43 375 查看


使用频率:★★★★☆



一、什么是组合模式

树形结构的实现,用于描述“整体-部分”的关系;


二、补充说明

使用场景:部分/整体场景,如树形菜单; 文件/文件夹; 树形结构的公司层级关系...


三、角色

抽象角色
叶子角色
树枝角色
客户端角色


四、例子,JAVA实现

利用组合模式实现如下文件/文件夹的树形结构关系;



抽象角色,抽象文件: 具体文件和具体文件夹都继承该抽象文件角色

package com.pichen.dp.structuralpattern.combination;
public abstract class File {

protected String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public abstract void showFileName();

}


树枝角色:具体文件夹

package com.pichen.dp.structuralpattern.combination;

import java.util.ArrayList;
import java.util.List;

public class Folder extends File{

private List<File> fileList = new ArrayList<File>();

public Folder(String name) {
this.name = name;
}
@Override
public void showFileName() {
System.out.println(this.name);
}

public void addFile(File file){
fileList.add(file);
}

//打印文件夹下的文件名
public void displayFiles(){
for(File file : this.fileList){
file.showFileName();
}
}
}


叶子角色:具体文件

package com.pichen.dp.structuralpattern.combination;
public class TXTFile extends File{

public TXTFile(String name) {
this.name = name;
}

@Override
public void showFileName() {
System.out.println(this.name);

}

}


package com.pichen.dp.structuralpattern.combination;
public class AVIFile extends File{
public AVIFile(String name) {
this.name = name;
}

@Override
public void showFileName() {
System.out.println(this.name);
}
}


客户端,模拟文件/文件夹树形结构

package com.pichen.dp.structuralpattern.combination;
public class Main {

public static void main(String[] args) {
Folder folder = new Folder("一级目录");
File txtFile = new TXTFile("二级文件txt");
File aviFile = new AVIFile("二级文件avi");
Folder txtFolder = new Folder("二级txt目录");
Folder aviFolder = new Folder("二级avi目录");

File txtFile1 = new TXTFile("三级文件txt1");
File txtFile2 = new TXTFile("三级文件txt2");
File txtFile3 = new TXTFile("三级文件txt3");
File aviFile1 = new AVIFile("三级文件avi1");
File aviFile2 = new AVIFile("三级文件avi2");

folder.addFile(txtFile);
folder.addFile(aviFile);
folder.addFile(txtFolder);
folder.addFile(aviFolder);

txtFolder.addFile(txtFile1);
txtFolder.addFile(txtFile2);
txtFolder.addFile(txtFile3);

aviFolder.addFile(aviFile1);
aviFolder.addFile(aviFile2);

System.out.println("一级目录下的文件:");
folder.displayFiles();
System.out.println("\n二级txt目录下的文件:");
txtFolder.displayFiles();
System.out.println("\n二级avi目录目录下的文件:");
aviFolder.displayFiles();
}
}


打印结果:

一级目录下的文件:
二级文件txt
二级文件avi
二级txt目录
二级avi目录

二级txt目录下的文件:
三级文件txt1
三级文件txt2
三级文件txt3

二级avi目录目录下的文件:
三级文件avi1
三级文件avi2


@Author      风一样的码农

@HomePageUrl http://www.cnblogs.com/chenpi/ 

@Copyright      转载请注明出处,谢谢~ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息