创建型
1,单例设计模式
2,工厂设计模式
3,建造者设计模式
4,原型设计模式
结构型
5,代理设计模式
6,桥接设计模式
7,装饰设计模式
8,适配器设计模式
9,外观设计模式
10,享元设计模式
11,组合设计模式
行为型
组合模式简介
组合模式是指:将一组对象组织成树形结构,以表示一种“部分 - 整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性;
使用场景
1,表示对象的部分-整体的层次结构时;
2,从一个整体中能独立出部分模块或功能的场景;
UML图
Component:抽象根节点
Leaf:具体叶子节点
Composite:具体枝干节点
下面以一个例子来说明组合设计模式;
电脑的文件系统大家使用过电脑的应该都熟悉,文件加中可以有文件夹或者文件;然后文件夹中还可以有文件夹或文件;这个文件管理系统就和我们今天要讲的组合模式非常匹配;下面这个文件系统为例阐述组合模式的实现;
代码实现
1,定义文件夹或文件的抽象类;
public abstract class FileSystemNode {
protected String path;
public FileSystemNode(String path) {
this.path = path;
}
public abstract int countNumOfFiles();
public abstract long countSizeOfFiles();
public String getPath() {
return path;
}
}
文件类
public class File extends FileSystemNode {
public File(String path) {
super(path);
}
@Override
public int countNumOfFiles() {
return 1;
}
@Override
public long countSizeOfFiles() {
java.io.File file = new java.io.File(path);
if (!file.exists()) return 0;
return file.length();
}
}
文件夹类
public class Directory extends FileSystemNode {
private List<FileSystemNode> subNodes = new ArrayList<>();
public Directory(String path) {
super(path);
}
@Override
public int countNumOfFiles() {
int numOfFiles = 0;
for (FileSystemNode fileOrDir : subNodes) {
numOfFiles += fileOrDir.countNumOfFiles();
}
return numOfFiles;
}
@Override
public long countSizeOfFiles() {
long sizeofFiles = 0;
for (FileSystemNode fileOrDir : subNodes) {
sizeofFiles += fileOrDir.countSizeOfFiles();
}
return sizeofFiles;
}
public void addSubNode(FileSystemNode fileOrDir) {
subNodes.add(fileOrDir);
}
public void removeSubNode(FileSystemNode fileOrDir) {
int size = subNodes.size();
int i = 0;
for (; i < size; ++i) {
if (subNodes.get(i).getPath().equalsIgnoreCase(fileOrDir.getPath())) {
break;
}
}
if (i < size) {
subNodes.remove(i);
}
}
}
Client:客户端大多数之使用者
public class client {
public static void main(String[] args) {
Directory fileSystemTree = new Directory("/");
Directory node_android = new Directory("/android/");
Directory node_java = new Directory("/java/");
fileSystemTree.addSubNode(node_android);
fileSystemTree.addSubNode(node_java);
File node_android_a = new File("/android/a.txt");
File node_java_b = new File("/android/b.txt");
Directory node_android_movies = new Directory("/android/movies/");
node_android.addSubNode(node_android_a);
node_java.addSubNode(node_java_b);
node_android.addSubNode(node_android_movies);
File node_android_movies_c = new File("/android/movies/c.avi");
node_android_movies.addSubNode(node_android_movies_c);
System.out.println("/files num:" + fileSystemTree.countNumOfFiles());
System.out.println("/android/ files num:" + node_android.countNumOfFiles());
System.out.println("/java/ files num:" + node_java.countNumOfFiles());
}
}
运行log输出:
/files num:3
/android/ files num:2
/java/ files num:1