设计模式 混合模式(整体部分模式)

混合模式(整体-部分模式):将对象组合成树形结构以表示“部分-整体”的层次结构,使单个对象(叶)和复合对象(枝)的使用具有一致性
核心:使对叶和枝的操作具备一致性,①简化客户端的使用,②节点自由增加
角色:

  • 抽象节点(Component):
    • (安全模式下)定义形成组合的叶和枝之间的共性部分(枝作为个体相关的操作) --> 需要使用枝的组合相关操作时需转型
    • (透明模式下)在共性部分外,还会提供枝的组合相关的操作 --> 对叶子对象使用枝的组合相关的功能时,可能出现错误
  • 树枝节点(Composite):整体部分(也存在作为个体时的功能),组合叶子节点和下一层树枝节点
    ① 存在作为组合相关的操作
    ② 存在作为个体相关的操作
  • 叶子节点(Leaf):个体部分,只实现个体相关的操作

使用场景:对象层次具备组合和个体的树形关系,且客户端希望忽略组合对象(枝)和个体对象(叶)的差异时,(即:枝对象同时具备组合部分的功能和个体部分的功能)

安全模式

// 抽象父类,维护叶和枝之间的共性(此时,共性多为枝作为个体部分的操作)
public abstract class Directory {
    protected String name;

    protected Directory(String name) {
        this.name = name;
    }

    public abstract void show(String prefix);
}
// 枝节点,实现抽象父类方法之外,还要实现作为组合功能的操作
public class Folder extends Directory{
    // 组合叶子节点和下一层树枝节点
    List<Directory> directorys = new ArrayList<>();

    public Folder(String name) {
        super(name);
    }

    @Override
    public void show(String prefix) {
        System.out.println(prefix + "Folder : " + name);
    }

    public void addDirectory(Directory directory){
        directorys.add(directory);
    }

    public void remoceDirectory(Directory directory){
        directorys.remove(directory);
    }

    public List<Directory> getDirectorys(){
        return directorys;
    }

    public void listDirectorys(String prefix){
        for(Directory directory : directorys){
            if(directory instanceof Folder) {
                directory.show(prefix);
                ((Folder) directory).listDirectorys(prefix + "    ");
            }else {
                directory.show(prefix);
            }
        }
    }
}
// 叶节点
public class File extends Directory{
    public File(String name) {
        super(name);
    }

    @Override
    public void show(String prefix) {
        System.out.println(prefix + "File : " + name);
    }
}

透明模式

// 抽象父类,维护叶和枝之间的共性,以及枝的组合相关操作
public abstract class Directory {
    protected String name;

    protected Directory(String name) {
        this.name = name;
    }

    public abstract void show(String prefix);

    public abstract boolean isFolder();

    // 枝的组合相关操作
    public abstract void addDirectory(Directory directory);

    public abstract void removeDirectory(Directory directory);

    public abstract List<Directory> getDirectorys();

    public abstract void listDirectorys(String prefix);
}
// 枝节点,实现抽象父类方法
public class Folder extends Directory {
    List<Directory> directorys = new ArrayList<>();

    public Folder(String name) {
        super(name);
    }

    @Override
    public void show(String prefix) {
        System.out.println(prefix + "Folder : " + name);
    }

    @Override
    public boolean isFolder() {
        return true;
    }

    public void addDirectory(Directory directory){
        directorys.add(directory);
    }

    public void removeDirectory(Directory directory){
        directorys.remove(directory);
    }

    public List<Directory> getDirectorys(){
        return directorys;
    }

    public void listDirectorys(String prefix){
        for(Directory directory : directorys){
            if(directory instanceof Folder) {
                directory.show(prefix);
                ((Folder) directory).listDirectorys(prefix + "    ");
            }else {
                directory.show(prefix);
            }
        }
    }
}
// 叶节点,对于组合相关的操作,需做一定的拒绝处理
public class File extends Directory {
    public File(String name) {
        super(name);
    }

    @Override
    public void show(String prefix) {
        System.out.println(prefix + "File : " + name);
    }

    @Override
    public boolean isFolder() {
        return false;
    }

    @Override
    public void addDirectory(Directory directory) {
        System.out.println("Not folder, do nothing!");
    }

    @Override
    public void removeDirectory(Directory directory) {
        System.out.println("Not folder, do nothing!");
    }

    @Override
    public List<Directory> getDirectorys() {
        return null;
    }

    @Override
    public void listDirectorys(String prefix) {
        System.out.println("Not folder, do nothing!");
    }
}
原文地址:https://www.cnblogs.com/kiqi/p/14054899.html