设计模式--组合模式Composite(结构型)

一、概念

组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

二、UML图

1.Component(对象接口),定义了对象可以做的事情。

2.Leaf(叶子结点对象)

3.Composite(其他结点对象,包含其他结点或者叶子节点)

三、例子

快递公司一般都有层级结构

/**
 * 顺丰公司抽象类
 * 定义了公司可以做哪些事情
 * @author eason
 *
 */
public abstract class SFCompany {
    
    //公司名
    protected String name;
    //公司级别
    protected int grade;
    
    public SFCompany(String name, int grade) {
        this.name = name;
        this.grade = grade;
    }
    
    //添加一个下属公司
    public abstract void add(SFCompany sf);
    //删除一个下属公司
    public abstract void remove(SFCompany sf);
    //打印自己
    public void display() {
        for(int i=1; i<=grade; i++) {
            System.out.print("-----");
        }
        System.out.println(name);
    }
    
}


/**
 * 最下层的公司
 * @author eason
 *
 */
public class SFTailCompany extends SFCompany{
    
    public SFTailCompany(String name, int grade) {
        super(name, grade);
    }

    @Override
    public void add(SFCompany sf) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(SFCompany sf) {
        throw new UnsupportedOperationException();
    }
    
//  已经提到父类中
//    @Override
//    public void display() {
//        for(int i=1; i<=grade; i++) {
//            System.out.print("-----");
//        }
//        System.out.println(name);
//    }
}


/**
 * 有下属公司的顺丰公司
 * @author eason
 *
 */
public class SFHeadCompany extends SFCompany{
    //保存下属公司
    private List<SFCompany> sfCompanys = new ArrayList<SFCompany>();
    
    public SFHeadCompany(String name, int grade) {
        super(name, grade);
    }

    @Override
    public void add(SFCompany sf) {
        sfCompanys.add(sf);
    }

    @Override
    public void remove(SFCompany sf) {
        sfCompanys.remove(sf);
    }

    //先打印自己,在打印自己的下属
    @Override
    public void display() {
//  已经提到父类中,用super.display();代替
//        for(int i=1; i<=grade; i++) {
//            System.out.print("-----");
//        }
//        System.out.println(name);
        super.display();
        for(SFCompany sf : sfCompanys) {
            sf.display();
        }
    }

}


/**
 * 测试类
 * @author eason
 *
 */
public class TestCompostite {

    public static void main(String[] args) {
        SFCompany head = new SFHeadCompany("总公司", 1);
        SFCompany shenzhen = new SFHeadCompany("深圳分公司", 2);
        SFCompany wuhan = new SFHeadCompany("武汉分公司", 2);
        SFCompany beijing = new SFHeadCompany("北京分公司", 2);
        SFCompany wuchang = new SFHeadCompany("武昌分公司", 3);
        SFCompany baoan = new SFHeadCompany("宝安分公司", 3);
        SFCompany luohu = new SFHeadCompany("罗湖分公司", 3);
        SFCompany nanshan = new SFHeadCompany("南山分公司", 3);
        
        head.add(shenzhen);
        head.add(wuhan);
        head.add(beijing);
        
        wuhan.add(wuchang);
        
        shenzhen.add(baoan);
        shenzhen.add(luohu);
        shenzhen.add(nanshan);
        //移除武汉
        //head.remove(wuhan);
        
        head.display();
        
    }

}

四、使用场景

1.需求中体现的是整体和部分的层次关系,以及用户希望忽略整体与部分的不同,统一的使用整体对象和部分对象时,就应该考虑组合模式。

2.组合模式让你可以优化处理递归或分级数据结构。如文件系统结构。

原文地址:https://www.cnblogs.com/justkong/p/6229655.html