这是我参与更文挑战的第19天,活动详情查看:更文挑战
组合模式
组合模式也可称之为整体模式。组合模式相对简单,它将一组相似的对象当做是一个整体对象来处理,将一个树状结构组合对象,最后设计提供一个统一方法去访问对象。
组合模式定义:将对象组合成树形结构来表现“局部-整体”层次性结构,对于“局部”和组合后的“整体”使用保持一致性。
组合模式角色:
- Component 抽象根节点
- Composite 子节点的枝干节点行为
- Leaf 叶子节点对象
实战
抽象类Dir实现了addDir、rmDir、print、getFiles方法,也就是Component角色;Folder代表Composite实现,拥有所有节点的集合dirs,具备addDir、rmDir、getFiles的能力;File代表Leaf叶子节点对象,不具备addDir、rmDir、getFiles的能力。File表示的是文件系统中最小单位,不再支持添加、删除、遍历子节点的能力了。
//
public abstract class Dir {
protected String name;
protected List<Dir> dirs = new ArrayList<>();
public Dir(String name){
this.name = name;
}
public abstract void addDir(Dir dir);
public abstract void rmDir(Dir dir);
public abstract void print();
public abstract List<Dir> getFiles();
public String getName(){
return name;
}
}
public class Folder extends Dir{
public Folder(String name){
super(name)
}
@override
public void addDir(Dir dir){
dirs.add(dir);
}
@override
public void rmDir(Dir dir){
dirs.remove(dir);
}
@override
public void print(){
Iterator<Dir> ier = dirs.iterator();
while(iter.hasNext()){
Dir dir = iter.next();
dir.print();
if(iter.hasNext()){
...
}
}
}
@override
public List<Dir> getFiles(){
return dirs;
}
}
public class File extends Dir{
public File(String name){
super(name);
}
@override
public void addDir(Dir dir){
thorw new Expection();
}
@override
public void rmDir(Dir dir){
thorw new Expection();
}
@override
public void print(){
....
}
@override
public List<Dir> getFiles(){
thorw new Expection();
}
}
///C文件夹下有windows和game两个子文件夹,windows子文件夹下面是windows.dat文件,game子文件夹下面是game.txt文件。
Dir diskC = new Folder("c");
diskC.addDir(new File("system.dat"));
Dir windows = new Folder("windows");
windows.addDir(new File("windows.dat"));
diskC.addDir(windows);
Dir game = new Folder("game");
diskD.addDir(new File("game.txt"));
diskC.addDir(game);
组合模式还分为透明模式和安全模式,透明模式其实就是上述例子中的形式。对于节点和叶节点之间接口上没有区分,只是在接口实现上子节点有些方法是不支持的。安全模式就是将节点和叶节点彻底分开,两者方法实现上存在差异不再拥有一样的方法调用。这样在遍历过程中就需要判断当前节点是子节点还是叶节点了。
总结
组合模式实际运用并不多见,更适用于界面UI设计当中会有所涉及。组合模式优点是高层模块调用简单,一颗树都是同一类型对象,局部和整体对调用者来说没有任何区别;清楚定义分层复杂对象,不必关心处理单个对象还是整体组合结构,简化代码逻辑;提供一种灵活树形机构,对树形结构控制相对简单。