美文网首页
设计模式(六)组合模式

设计模式(六)组合模式

作者: 六脉神见 | 来源:发表于2018-09-27 12:32 被阅读0次

    定义:
    组合模式将对象组织到树结构中,可以用来描述整体和部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。

    组合模式应用场景:
    通常,我们用组合模式来设计树形结构,如树形菜单,目录结构等。在树形菜单中,分为有子节点的普通节点和无子节点的叶子节点。在模式中,父节点和子节点都实现同一个抽象接口,说明子节点和父节点同质。可以把父节点看作持有一组子节点的节点。
    UML如下:

    image.png

    图中我们以一公司统计各分公司所有部门的人数为例
    角色如下:
    1、Organization接口,表示公司的组织结构的抽象,其中定义了统计人数的方法countMember.
    2、CompositeOranization组合机构,表示拥有下属机构的机构,如总公司,分公司,都属于组合机构.其持有一个机构列表表示其下属机构.这个是模式中的关键部分
    3、LeafOrganization叶子机构,表示没有下属机构的机构,如具体的部门。

    代码实现:

    /**
     * 组织结构接口
     * @author saisaimayi
     *2018年9月27日
     */
    public interface Organization {
        
        /**
         * 计算机构人数
         * @return 机构人数
         */
        public int countMember();
    
    }
    
    /**
     * 组合机构实现类
     * @author saisaimayi
     *2018年9月27日
     */
    public class CompositeOrganization implements Organization {
        
        private List<Organization> organs = new ArrayList<Organization>();
        
        public void addOrganization(Organization organ){
            organs.add(organ);
        }
        
        public void removeOrganization(Organization organ){
            organs.remove(organ);
        }
        
        /**
         * 计算部门人数
         */
        public int countMember() {
            int result = 0;
            for (Organization organ : organs) {
                result += organ.countMember();
            }
            return result;
        }
    }
    
    /**
     * 叶子机构实现类
     * @author saisaimayi
     *2018年9月27日
     */
    public class LeafOrganization implements Organization {
    
        private int member;
        
        public void setMember(int member) {
            this.member = member;
        }
    
        /**
         * 叶子部门计算人数
         */
        public int countMember() {
            System.out.println("本部门有员工:"+member+"名");
            return member;
        }
    
    }
    
    public class Client extends TestCase {
        
        public void test(){
            CompositeOrganization headQuarters = new CompositeOrganization();
            CompositeOrganization subCompanyOne = new CompositeOrganization();
            LeafOrganization depOne = new LeafOrganization();
            LeafOrganization depTwo = new LeafOrganization();
            depOne.setMember(15);
            depTwo.setMember(13);
            subCompanyOne.addOrganization(depOne);
            subCompanyOne.addOrganization(depTwo);
            
            CompositeOrganization subCompanyTwo = new CompositeOrganization();
            LeafOrganization depThree = new LeafOrganization();
            LeafOrganization depFour = new LeafOrganization();
            depThree.setMember(30);
            depFour.setMember(40);      
            subCompanyTwo.addOrganization(depThree);
            subCompanyTwo.addOrganization(depFour);
            
            headQuarters.addOrganization(subCompanyOne);
            headQuarters.addOrganization(subCompanyTwo);
            
            int count = countForDep(headQuarters);
            System.out.println("部门人数为:"+count);
        }
    
        /**
         * 计算某个部门的人数
         * @return 
         */
        private int countForDep(CompositeOrganization dep) {
            return dep.countMember();
        }
    }
    
    输出结果:
    本部门有员工:15名
    本部门有员工:13名
    本部门有员工:30名
    本部门有员工:40名
    部门人数为:98
    

    相关文章

      网友评论

          本文标题:设计模式(六)组合模式

          本文链接:https://www.haomeiwen.com/subject/yqusoftx.html