6月更文挑战|设计模式 —— 组合模式

399 阅读2分钟

这是我参与更文挑战的第19天,活动详情查看:更文挑战

组合模式

组合模式也可称之为整体模式。组合模式相对简单,它将一组相似的对象当做是一个整体对象来处理,将一个树状结构组合对象,最后设计提供一个统一方法去访问对象。

组合模式定义:将对象组合成树形结构来表现“局部-整体”层次性结构,对于“局部”和组合后的“整体”使用保持一致性。

组合模式角色:

  1. Component 抽象根节点
  2. Composite 子节点的枝干节点行为
  3. 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设计当中会有所涉及。组合模式优点是高层模块调用简单,一颗树都是同一类型对象,局部和整体对调用者来说没有任何区别;清楚定义分层复杂对象,不必关心处理单个对象还是整体组合结构,简化代码逻辑;提供一种灵活树形机构,对树形结构控制相对简单。