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!");
        }
    }
    
  • 相关阅读:
    fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
    SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
    FTP 服务搭建后不能访问问题解决
    指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
    Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
    svn Please execute the 'Cleanup' command. 问题解决
    .net 操作MongoDB 基础
    oracle 使用绑定变量极大的提升性能
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
  • 原文地址:https://www.cnblogs.com/kiqi/p/14054899.html
Copyright © 2011-2022 走看看