zoukankan      html  css  js  c++  java
  • 设计模式 混合模式(整体部分模式)

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

    • 抽象节点(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!");
        }
    }
    
  • 相关阅读:
    pl/sql 导入csv到oracle时乱码问题
    mybatis if判断两个值是否相等存在的坑啊
    mybatis #与$占位符的区别
    NPM使用前设置和升级
    AWS ec2的ubuntu14.04上安装git服务
    Apache性能优化
    i5+GT730+B85安装OSX10.10.5 (Yosemite Install(14F27).cdr)
    IE的css hack
    sourcetree(mac)设置代理
    webpack配置的说明
  • 原文地址:https://www.cnblogs.com/kiqi/p/14054899.html
Copyright © 2011-2022 走看看