什么组合设计模式?为什么要使用组合设计模式?
组合模式:组合(Composite)模式是一种对象的行为模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式属于结构型设计模式。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式最大的特性就是使用树形结构,这里是把结构封装层树形结构,客户端无需关注内部实现,只需要更加节点获取树形里面指定的节点数据、定义树节点方法进行层级管理,我们常见的应用场景:
树形菜单,文件目录,磁盘分类,组织结构 这种类型都可以是组合模式的应用场景。
这里我们就采用树形结构的方式来讲解,树形结构的最大特点就是部分和整体就是组合设计模式,举个例子我的计算机和我的D盘和C盘就是属于部分,而计算机就是一个整体。
计算机:
D盘:
计算机属于整体,D盘C盘属于计算机的部分,D盘下面的文件大小,文件类型,日期,属性就属于D盘的部分。
话不多说直接上代码:
代码类图:
磁盘:
package com.xy.design.combination;
/**
* <p>
*
* @author yang
* @since 2022-10-22
*/
public abstract class Disk {
public abstract File getFile();
public abstract void add(Disk component);
}
计算机:
package com.xy.design.combination;
import org.springframework.beans.factory.annotation.Autowired;
/**
* <p>
*
* @author yang
* @since 2022-10-22
*/
public class Competer extends Disk {
private File file;
private int level;
public Competer(File file) {
this.file = file;
}
@Autowired
public File getFile() {
System.out.println("文件名称:" + file.getName() + " 文件大小:" + file.getSize() + " 文件时间: " + file.getCreateTime());
return file;
}
@Override
public void add(Disk component) {
}
}
文件类:
package com.xy.design.combination;
/**
* @author yang
* @description
*/
public class File extends Disk {
private String name;
private String content;
private long size;
private String createTime;
public File(String name, String content, long size, String createTime) {
this.name = name;
this.content = content;
this.size = size;
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
@Override
public File getFile() {
return this;
}
@Override
public void add(Disk component) {
component.getFile();
}
}
组合模式的特点:整体和部分。
组合模式透明的组合模式和安全的组合模式
透明模式,是把用来组合使用的方法放到抽象类中,不管叶子节点还是树枝节点都有相同的结构,如果处理不当,这个会在运行期出现问题,不是很建议的方式;
安全模式你可以理解为电脑的c盘和d盘是分开的,而c盘的结构和D盘一样,但是他们之间的权限是不一样的,也可以理解为非透明模式。
其实代码很简单,你只要满足部分和整体这个概念,一个组合设计模式就成功实现了,文件是属于磁盘的一部分,磁盘又属于计算机的一部分,而计算机就是属于代码的一部分,代码就是我正在的写的一部分。而我正在写代码,我就是一个整体不是。
以上的代码还可以优化,比如文件的层级结构,和节点信息,我们可以使用Tree来完善我们的代码,加入一些curd方法和循环迭代。
以上就是组合模式的使用。
————没有与生俱来的天赋,都是后天的努力拼搏(我是小杨,谢谢你的关注和支持)