组合模式 (Composite Pattern)

1、类图

2、代码

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    
    public static void main(String[] args) {
        /*
         * |--- folder1
         *     |--- file11
         *     |--- file12
         * |--- folder2
         *     |--- folder3
         *         |--- file31
         * */
        Component folder1 = new Composite();
        Component folder2 = new Composite();
        Component folder3 = new Composite();
        Component file11 = new Leaf();
        Component file12 = new Leaf();
        Component file31 = new Leaf();
        folder1.add(file11);
        folder1.add(file12);
        folder2.add(folder3);
        folder3.add(file31);
        
        // folder1内有2个文件
        System.out.println(folder1.getSize());
        // folder2内有1个文件
        System.out.println(folder2.getSize());
    }

}

/* 抽象构件 */
abstract class Component {
    
    public abstract void add(Component component);     // 增加成员
    public abstract void remove(Component component);  // 删除成员
    public abstract Component get(int i);              // 获取成员
    public abstract int getSize();      // 业务方法
    
}

/* 容器构件 */
class Composite extends Component {

    private ArrayList<Component> list = new ArrayList<>();
    
    @Override
    public void add(Component component) {
        list.add(component);
    }

    @Override
    public void remove(Component component) {
        list.remove(component);
    }

    @Override
    public Component get(int i) {
        return (Component)list.get(i);
    }

    @Override
    public int getSize() {
        int size = 0;
        Iterator<Component> it = list.iterator();
        while(it.hasNext()) {
            Component component = (Component)it.next();
            size += component.getSize();
        }
        return size;
    }

}

/* 叶子构件 */
class Leaf extends Component {

    @Override
    public void add(Component component) {
        System.out.println("异常!叶子构件不具备该方法");
    }

    @Override
    public void remove(Component component) {
        System.out.println("异常!叶子构件不具备该方法");
    }

    @Override
    public Component get(int i) {
        System.out.println("异常!叶子构件不具备该方法");
        return null;
    }

    @Override
    public int getSize() {
        return 1;
    }

}

 

posted @ 2022-04-25 16:32  HanselHuang  阅读(35)  评论(0编辑  收藏  举报