设计模式(六)组合模式

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

组合模式应用场景:
通常,我们用组合模式来设计树形结构,如树形菜单,目录结构等。在树形菜单中,分为有子节点的普通节点和无子节点的叶子节点。在模式中,父节点和子节点都实现同一个抽象接口,说明子节点和父节点同质。可以把父节点看作持有一组子节点的节点。
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 organs = new ArrayList();
    
    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

你可能感兴趣的:(设计模式(六)组合模式)