组合模式
定义:组合模式是一个整体部分的概念,可以与聚合对比理解,聚合个体与整体之间并无强依赖关系,不属于一个体系,比如电脑U盘的使用,u盘可以独立存在,不属于电脑结构体系。而组合模式则是所有对象属于一个结构体系,例如菜单的树形结构,上面的每一道菜如果独立出菜单则无法被定位。
生活中公司的组织架构,电脑的文件夹层级关系,这都都是属于组合结构。而使用组合结构的设计模式,会使得对象结构层次清晰,不会出现循环嵌套的引用结构。
比如文件系统,不需要在每一个文件中定义它属于哪一个文件夹,便不会导致结构层次过于复杂。
例如如下模式,深层嵌套的时候出现这种结构非常麻烦,特别是做循环遍历的时候,这里就非常适合使用组合模式,降低空间复杂度,mapping文件的标签使用就是这种思想
List<List<List<List<List>>>>
写法:
写法:定义一个抽象类,但是只定义一个通用的方法,方法入参为抽象引用,子类具体的功能实现由子类自己实现,不过最后都是由抽象的方法统一调用。
源码中使用:HashMap.addAll()和ArrayList.addAll()方法以及mybaitis中的mapping文件中的每一个标签,都抽象与SQLNode,都是使用了组合模式,使得复杂的代码结构层次清晰
package group;
/**
-
定义一个顶层抽象类,北凉军营
*/
public abstract class BeiLiang {/**
- 定义一个公共属性
*/
protected String name;
/**
- 定义一个抽象方法 方法入参为顶层抽象Directory,不论是北凉军营,还是北凉军,都有一个共同功能,拒北
*/
public abstract void rejectNorth();
public BeiLiang(String name) {
this.name = name;
}
} - 定义一个公共属性
package group;
import java.util.ArrayList;
import java.util.List;
/**
-
拒北城
*/
public class RejectNorthCity extends BeiLiang {private List beiliangjun = new ArrayList<>();
/**
- 军营定级
/
private Integer level;
/* - 调用抽象的构造方法,使用抽象类的name属性
- @param name
*/
public RejectNorthCity(String name, Integer level) {
super(name);
this.level = level;
}
public void addJun(BeiLiang beiLiang){
beiliangjun.add(beiLiang);
}@Override
public void rejectNorth() {
for(BeiLiang beiLiang: beiliangjun){
beiLiang.rejectNorth();
}
System.out.println(this.name);
}
} - 军营定级
package group;
/**
-
定义一个文件类,通用继承顶层抽象类,中原宗师
*/
public class ZhongYuanGuru extends BeiLiang {
public ZhongYuanGuru(String name) {
super(name);
}@Override
public void rejectNorth() {
System.out.println(this.name);
}
}
package group;
public class test {
public static void main(String[] args) {
BeiLiang xufengnian = new ZhongYuanGuru("徐凤年");
BeiLiang caiqingshan = new ZhongYuanGuru("柴青山");
BeiLiang loufang = new ZhongYuanGuru("楼荒");
BeiLiang taohuajianshen = new ZhongYuanGuru("桃花剑神");
/**
* 柴青山,楼荒,桃花剑神在拒北城一站中数据拒北城关系
*/
RejectNorthCity jubeicheng = new RejectNorthCity("拒北城",2);
jubeicheng.addJun(caiqingshan);
jubeicheng.addJun(loufang);
jubeicheng.addJun(taohuajianshen);
RejectNorthCity beiliang = new RejectNorthCity("北凉",1);
/**
* 拒北城属于北凉,北凉潘王徐凤年属于北凉
*/
beiliang.addJun(jubeicheng);
beiliang.addJun(xufengnian);
beiliang.rejectNorth();
}
}
输出结构可以看出结构关系,输出方法处理一下打印,关系更明朗

浙公网安备 33010602011771号