(八)组合模式-代码实现

介绍

意图:将对象组合成树形结构以表示“部分 -整体”的层次结构。 C o m p o s i t e使得用户对单个对象和组合对象的使用具有一致性。

适用性:1,你想表示对象的部分 -整体层次结构。 2,你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

应用场景:树形结构,从树顶控制整个树的操作.

代码:

//政府接口

package note.com.composite;

/**
 * 政府接口
 * @author lxz
 *
 */
public interface Government{

    public void build(String str1);
    
    public boolean add(Government gov);
    
    public boolean delete(Government gov);
}

//定义了默认方法的抽象类

package note.com.composite;

/**
 * 构造默认新增,删除方法
 * @author lxz
 *
 */
public abstract class AbstractGovernment implements Government{

    public boolean add(Government gov) {
        return false;
    }
    
    public boolean delete(Government gov) {
        return false;
    }
}

//树顶,根节点

package note.com.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 中国政府
 * @author lxz
 *
 */
public class ChinaGov extends AbstractGovernment{

    private List<Government> govList = new ArrayList<Government>();
    public void build(String str1) {
        System.out.println("中国:"+str1);
        doIter(str1);
    }
    
    private void doIter(String str1){
        for(Government gov:govList){
            gov.build(str1);
        }
    }
    
    @Override
    public boolean add(Government gov) {
        govList.add(gov);
        return true;
    }
    
    @Override
    public boolean delete(Government gov) {
        govList.remove(gov);
        return true;
    }
    
}

//无子节点的节点

package note.com.composite;

/**
 * 北京市政府
 * @author lxz
 *
 */
public class BeiJingGov extends AbstractGovernment{

    public void build(String str1) {
        System.out.println("北京市:"+str1);
    }

}
package note.com.composite;

/**
 * 郑州市政府
 * @author lxz
 *
 */
public class ZhengZhouGov extends AbstractGovernment{

    public void build(String str1) {
        System.out.println("郑州市:"+str1);
    }

}

//有子节点的节点

package note.com.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 河南省政府
 * @author lxz
 *
 */
public class HeNanGov extends AbstractGovernment{

    private List<Government> govList = new ArrayList<Government>();
    public void build(String str1) {
        System.out.println("河南省:"+str1);
        doIter(str1);
    }
    
    private void doIter(String str1){
        for(Government gov:govList){
            gov.build(str1);
        }
    }
    
    
    @Override
    public boolean add(Government gov) {
        govList.add(gov);
        return true;
    }
    
    @Override
    public boolean delete(Government gov) {
        govList.remove(gov);
        return true;
    }

}

//测试类

package note.com.composite;

public class CompositeTest {
    public static void main(String[] args) {
        Government gov = new ChinaGov();
        Government beijing = new BeiJingGov();
        Government henan = new HeNanGov();
        gov.add(beijing);
        gov.add(henan);
        Government zhengzhou = new ZhengZhouGov();
        henan.add(zhengzhou);
        
        //中国下发命令
        gov.build("大扫除");
        //河南下发命令
        henan.build("涨工资");
        
    }
}
原文地址:https://www.cnblogs.com/qinggege/p/5234317.html