你还不懂设计模式? - 组合设计模式

组合模式(Composite Pattern),顾名思义。是关于类的结构的一种设计模式。是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。最常见的树形结构设计如系统菜单,组织机构等等。

典型的结构图如下:
你还不懂设计模式? - 组合设计模式_第1张图片
实现如下:

@Data
public class SysMenu implements Serializable {
     
    private static final long serialVersionUID = 1L;

    /**
     * 菜单ID
     */
    private String menuId;

    /**
     * 父菜单ID,一级菜单为0
     */
    private String parentId;

    /**
     * 父菜单名称
     */
    private String parentName;

    /**
     * 菜单名称
     */
    private String name;

    /**
     * 菜单URL
     */
    private String url;

    /**
     * 授权(多个用逗号分隔,如:user:list,user:create)
     */
    private String perms;

    /**
     * 类型     0:目录   1:菜单   2:按钮
     */
    private Integer type;

    /**
     * 菜单图标
     */
    private String icon;

    /**
     * 排序
     */
    private Integer orderNum;

    /**
     * ztree属性
     */
    private Boolean open;

    /**
     * 子节点
     */
    private List<SysMenu> list;

    public SysMenu(String menuId, String parentId, String name) {
     
        this.menuId = menuId;
        this.parentId = parentId;
        this.name = name;
    }

    @Override
    public String toString() {
     
        return "SysMenu{" +
                "menuId='" + menuId + '\'' +
                ", parentId='" + parentId + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

再来测试一下:

  public static void main(String[] args) {
     
        SysMenu root = new SysMenu("1","#","root");
        SysMenu s1 = new SysMenu("2","1","leaf1");
        SysMenu s11 = new SysMenu("21","2","leaf11");
        SysMenu s12 = new SysMenu("22","2","leaf12");
        SysMenu s13 = new SysMenu("23","2","leaf13");
        s1.setList(Arrays.asList(s11,s12,s13));

        SysMenu s2 = new SysMenu("3","1","leaf2");
        SysMenu s21 = new SysMenu("31","3","leaf21");
        SysMenu s22 = new SysMenu("32","3","leaf22");
        s2.setList(Arrays.asList(s21,s22));

        SysMenu s3 = new SysMenu("4","1","leaf3");

        root.setList(Arrays.asList(s1,s2,s3));

        List<SysMenu> menus = new ArrayList<>();
        getMenus(root,menus);

        menus.forEach(System.out::println);
    }
    //递归遍历
    public static List<SysMenu> getMenus(SysMenu menu,List<SysMenu> menus){
     

        List<SysMenu> list = menu.getList();
        if (!CollectionUtils.isEmpty(list)){
     
            list.forEach(sm -> {
     
                getMenus(sm,menus);
                menus.add(sm);
            });
        }
        return menus;
    }

以上就是一个简单的树形结构的实现,树形结构最核心的方法就是遍历。而遍历最好的方式就是递归。

你可能感兴趣的:(设计模式,设计模式,java)