zoukankan      html  css  js  c++  java
  • 组合(整体-部分)模式

    组合模式定义如下:

    组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,
    组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。

    组合模式分为透明组合模式和安全组合模式,其分别的UML图如下:

      

                  图1-1 透明组合模式

                图1-2 安全组合模式

    透明组合模式和安全组合模式的区别就是安全组合模式将管理其他组件的功能单独提出,叶子组件不具备管理其他组件的功能。

    透明组合模式
    abstract class Component {  
        public abstract void add(Component c); //增加成员  
        public abstract void remove(Component c); //删除成员  
        public abstract Component getChild(int i); //获取成员  
        public abstract void operation();  //业务方法  
    } 
    class Leaf extends Component {  
        public void add(Component c) {   
            //异常处理或错误提示   
        }     
              
        public void remove(Component c) {   
            //异常处理或错误提示   
        }  
          
        public Component getChild(int i) {   
            //异常处理或错误提示  
            return null;   
        }  
          
        public void operation() {  
            //叶子构件具体业务方法的实现  
        }   
    }  
    class Composite extends Component {  
        private ArrayList<Component> list = new ArrayList<Component>();  
          
        public void add(Component c) {  
            list.add(c);  
        }  
          
        public void remove(Component c) {  
            list.remove(c);  
        }  
          
        public Component getChild(int i) {  
            return (Component)list.get(i);  
        }  
          
        public void operation() {  
            //容器构件具体业务方法的实现  
            //递归调用成员构件的业务方法  
            for(Object obj:list) {  
                ((Component)obj).operation();  
            }  
        }     
    }  
    安全组合模式
    abstract class Component {    
        public abstract void operation();  //业务方法  
    } 
    class Leaf extends Component {  
        public void operation() {  
            //叶子构件具体业务方法的实现  
        }   
    }  
    class Composite extends Component {  
        private ArrayList<Component> list = new ArrayList<Component>();  
          
        public void add(Component c) {  
            list.add(c);  
        }  
          
        public void remove(Component c) {  
            list.remove(c);  
        }  
          
        public Component getChild(int i) {  
            return (Component)list.get(i);  
        }  
          
        public void operation() {  
            //容器构件具体业务方法的实现  
            //递归调用成员构件的业务方法  
            for(Object obj:list) {  
                ((Component)obj).operation();  
            }  
        }     
    }  

    组合模式为处理树形结构提供了一种较为完美的解决方案,它描述了如何将容器和叶子进行递归组合,使得用户在使用时无须对它们进行区分,可以一致地对待容器和叶子。

    参考文献:http://blog.csdn.net/lovelion/article/details/7956898

  • 相关阅读:
    git add后 有的文件后悔 add了还没有commit 怎么办?
    go mod module declares its path as: gtihub.com/xxx-xx but was required as:xx-xx
    mysql 复合索引(联合索引) a b c的使用
    git 的初始化使用
    Mac 安装 mysql5.7
    Go Modules与GOPROXY 配置
    ZWWL的短信详设
    Linux 查看文件权限命令ls -l 输出信息每列所代表的含义
    ubuntu/deepin 下增加 goland 桌面快捷方式 goland.desktop
    go语言的冒泡 选择 快排 二分 算法实现
  • 原文地址:https://www.cnblogs.com/sstone/p/8472761.html
Copyright © 2011-2022 走看看