Java 设计模式之组合模式

本文为笔者学习《Head First设计模式》的笔记,并加入笔者自己的理解和归纳总结

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

结构图
Java 设计模式之组合模式_第1张图片
菜单(Menu)有两个子类,一个是菜单项(MenuItem),另一个是包含菜单项的菜单(MenuComposite)。print方法用于输出菜单。

public abstract class Menu {
    private String name;

    public Menu(String name) {
        this.name = name;
    }

    public abstract void addMenu(Menu menu);

    public void print() {
        print(0);
    }

    public void print(int indent) {
        for (int index = 0; index < indent; index++) {
            System.out.print("#");
        }
        System.out.println(name);
    }

}

public class MenuItem extends Menu {

    public MenuItem(String name) {
        super(name);
    }

    public void addMenu(Menu menu) {
        System.out.println("Unsupport method addMenu");
    }

}

public class MenuComposite extends Menu {
    private List menuList = new ArrayList<>();

    public MenuComposite(String name) {
        super(name);
    }

    @Override
    public void addMenu(Menu menu) {	
        menuList.add(menu);
    }

    @Override
    public void print(int indent) {	
        super.print(indent);

        for (Menu menu : menuList) {
            menu.print(indent + 1);
        }
    }

}

运行

public static void main(String[] args) {
    Menu fileMenu = new MenuComposite("File");

    Menu newMenuItem = new MenuItem("New");
    fileMenu.addMenu(newMenuItem);

    Menu openMenu = new MenuComposite("Open");
    fileMenu.addMenu(openMenu);

    Menu openFileMenuItem = new MenuItem("Open File");
    openMenu.addMenu(openFileMenuItem);

    Menu openDirectoryMenuItem = new MenuItem("Open Directory");
    openMenu.addMenu(openDirectoryMenuItem);

    fileMenu.print();
}

输出
Java 设计模式之组合模式_第2张图片

相关文章
Java 设计模式

你可能感兴趣的:(Java,设计模式,Java学习笔记)