目录
1.核心本质
通过树形结构的组织方式,让我们可以采用统一的方式管理整体或部分,处理层次结构数据和对象组合时特别有用
2.组成部分
组件(Component): 定义组合中所有对象的通用接口,可以是抽象类或者接口。它声明了在组合中管理子组件的方法,如添加、移除和获取子组件。
叶子(Leaf): 表示组合中的叶子节点对象,它没有子节点。实现了组件接口的方法,但对于添加子节点等操作可能不实现(视具体需求而定)。
复合对象(Composite): 表示容器节点,它包含子节点。复合对象实现了组件接口,并且通常会存储子组件,实现组件接口中的操作方法。
3.优点
1.虽然内部复杂,但是客户端使用很简单。
2.可以一致的使用一个组合结构或者单个对象。
3.新增和删除叶子节点很方便。
4.通过叶子节点和符合对象的递归组合,形成树形结构,但是对结构控制很简单。
4.代码结构图
5.代码
5.1 组件
/**
* 组件
*/
public abstract class MenuComponent {
protected String name;
protected int level;
public void add(MenuComponent menuComponent){
throw new UnsupportedOperationException();
}
public void remove(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
public void getChild(int index) {
throw new UnsupportedOperationException();
}
public String getName(){
return name;
}
public abstract void print();
}
5.2 复合对象
/**
* 复合对象
*/
public class Menu extends MenuComponent{
private List<MenuComponent> menuComponents = new ArrayList<>();
public Menu(String name,int level){
this.name =name;
this.level=level;
}
@Override
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponent.remove(menuComponent);
}
@Override
public void getChild(int index) {
menuComponents.get(index);
}
@Override
public void print() {
//打印菜单名词
System.out.println(name);
//打印子菜单名称
for (MenuComponent menuComponent : menuComponents) {
menuComponent.print();
}
}
}
5.3 叶子
/**
* 叶子
*/
public class MenuItem extends MenuComponent{
public MenuItem(String name, int level) {
this.name = name;
this.level = level;
}
@Override
public void print() {
System.out.println(name);
}
}
5.4 客户端
public class Client {
public static void main(String[] args) {
MenuComponent menuComponent = new Menu("系统管理",1);
Menu people = new Menu(" 人员管理", 2);
MenuItem peopleAdd = new MenuItem(" 人员添加", 3);
MenuItem peopleRemove = new MenuItem(" 人员删除", 3);
Menu admin = new Menu(" 管理员菜单", 3);
MenuItem adminAdd = new MenuItem(" 管理员新增", 4);
MenuItem adminRemove = new MenuItem(" 管理员删除", 4);
MenuItem adminPermission = new MenuItem(" 管理员权限变更", 4);
admin.add(adminAdd);
admin.add(adminRemove);
admin.add(adminPermission);
people.add(peopleAdd);
people.add(peopleRemove);
people.add(admin);
Menu blackList = new Menu(" 黑名单管理", 2);
MenuItem blackListAdd = new MenuItem(" 黑名单新增", 3);
MenuItem blackListSave = new MenuItem(" 黑名单更新", 3);
blackList.add(blackListAdd);
blackList.add(blackListSave);
Menu permission = new Menu(" 权限管理", 2);
MenuItem permissionSelect = new MenuItem(" 权限查询", 3);
MenuItem permissionAdd = new MenuItem(" 权限新增", 3);
MenuItem permissionSave = new MenuItem(" 权限更新", 3);
permission.add(permissionSelect);
permission.add(permissionAdd);
permission.add(permissionSave);
menuComponent.add(people);
menuComponent.add(blackList);
menuComponent.add(permission);
menuComponent.print();
}
}
5.5 运行结果
6.分类
6.1 透明组合模式
在组件(5.1)中就声明了复合对象(5.2)和叶子节点(5.3)的所有方法,是比较标准的,但是对于叶子节点来说,新增或删除叶子节点的方法是没有必要的。
6.2 安全组合模式
相对于透明组合模式,安全组合模式没有在组件中声明这些方法,而是在复合对象中声明,叶子节点可以不用实现这些方法。