文章目录
前言
组合模式表示一种树形结构,树状结构很常见,职位分配,上级部门下级部门,相同级别的组成上级部门等,树形菜单等。实现主要通过树枝和叶子实现统一接口,树枝内部组合该接口。树枝内部组合该接口,并且含有内部属性 List,里面放 Component。
一、组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
二、使用步骤
1.构造树形菜单
package structure.CompositePattern;
import java.util.ArrayList;
import java.util.List;
/**
* 属性菜单
*/
public class TreeMenu {
/**
* 菜单ID
*/
private Long menuId;
/**
* 菜单名称
*/
private String menuName;
/**
* 菜单路径
*/
private String path;
private Long parentId;
/**
* 子菜单
*/
private ArrayList<TreeMenu> childMenuList = new ArrayList<>();
/**
* 构造器
* @param menuId
* @param menuName
* @param path
*/
public TreeMenu(Long menuId, String menuName, String path) {
this.menuId = menuId;
this.menuName = menuName;
this.path = path;
}
/**
* 添加子节点菜单
*/
public void addSysMenu(TreeMenu sysMenu) {
this.childMenuList.add(sysMenu);
}
/**
* 删除子节点菜单
*/
public void removeSysMenu(TreeMenu sysMenu) {
this.childMenuList.remove(sysMenu);
}
/**
* 获取字节点菜单
* @return
*/
public ArrayList<TreeMenu> getChildSysMenu() {
return this.childMenuList;
}
@Override
public String toString() {
return "TreeMenu{" +
"menuId=" + menuId +
", menuName='" + menuName + '\'' +
", path='" + path + '\'' +
", parentId=" + parentId +
", childMenuList=" + childMenuList +
'}';
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
}
2.添加数据测试
package structure.CompositePattern;
/**
* 客户端构造菜单
* 系统管理
* 用户 角色 菜单
* 增 删 改 查 增 删 改 查 增 删 改 查
*/
public class Client {
public static void main(String[] args) {
//构造树形菜单
//系统管理
TreeMenu treeMenu = new TreeMenu(1L,"系统管理","/system");
//用户管理
TreeMenu userMenu = new TreeMenu(2L,"用户管理","/system/user");
treeMenu.addSysMenu(userMenu);
userMenu.setParentId(1L);
//角色管理
TreeMenu roleMenu = new TreeMenu(3L,"角色管理","/system/role");
treeMenu.addSysMenu(roleMenu);
roleMenu.setParentId(1L);
//权限管理
TreeMenu permisMenu = new TreeMenu(4L,"权限管理","/system/permis");
treeMenu.addSysMenu(permisMenu);
permisMenu.setParentId(1L);
//用户管理增
TreeMenu userMenuAdd = new TreeMenu(5L,"用户管理","/system/user/add");
//用户管理删
TreeMenu userMenuDel = new TreeMenu(6L,"用户管理","/system/user/del");
//用户管理改
TreeMenu userMenuUpdate = new TreeMenu(7L,"用户管理","/system/user/update");
//用户管理查
TreeMenu userMenuRead = new TreeMenu(8L,"用户管理","/system/user/read");
userMenu.addSysMenu(userMenuAdd);
userMenuAdd.setParentId(2L);
userMenu.addSysMenu(userMenuDel);
userMenuDel.setParentId(2L);
userMenu.addSysMenu(userMenuUpdate);
userMenuUpdate.setParentId(2L);
userMenu.addSysMenu(userMenuRead);
userMenuRead.setParentId(2L);
//权限管理增
TreeMenu permisMenuAdd = new TreeMenu(9L,"权限管理","/system/permis/add");
//权限管理改
TreeMenu permisMenuUpdate = new TreeMenu(10L,"权限管理","/system/permis/update");
//权限管理查
TreeMenu permisMenuRead = new TreeMenu(11L,"权限管理","/system/permis/read");
//权限管理删
TreeMenu permisMenuDelete = new TreeMenu(12L,"权限管理","/system/permis/delete");
permisMenu.addSysMenu(permisMenuAdd);
permisMenuAdd.setParentId(4L);
permisMenu.addSysMenu(permisMenuUpdate);
permisMenuUpdate.setParentId(4L);
permisMenu.addSysMenu(permisMenuRead);
permisMenuRead.setParentId(4L);
permisMenu.addSysMenu(permisMenuDelete);
permisMenuDelete.setParentId(4L);
System.out.println(treeMenu);
}
}
总结
一般来说,树状结构的都会考虑使用组合模式。叶子节点,树枝节点,组合模式连接叶子和树枝节点。