在 Java 中,组合模式(Composite Pattern)常用于树形结构,比如菜单、文件夹、组织架构等。核心思想是:把“单个对象”和“组合对象”一视同仁。
下面我用 “菜单 + 子菜单” 的例子给你写一个完整、易懂的 Java 组合模式示例。
组合模式通常包含三部分:
// 菜单组件
public abstract class MenuComponent {
public void add(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
public void remove(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
public MenuComponent getChild(int i) {
throw new UnsupportedOperationException();
}
public String getName() {
throw new UnsupportedOperationException();
}
public void print() {
throw new UnsupportedOperationException();
}
}
// 菜单项(叶子)
public class MenuItem extends MenuComponent {
private String name;
public MenuItem(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public void print() {
System.out.println("菜单项:" + name);
}
}
import java.util.ArrayList;
import java.util.List;
// 菜单(可包含子菜单或菜单项)
public class Menu extends MenuComponent {
private String name;
private List<MenuComponent> menuComponents = new ArrayList<>();
public Menu(String name) {
this.name = name;
}
@Override
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
@Override
public MenuComponent getChild(int i) {
return menuComponents.get(i);
}
@Override
public String getName() {
return name;
}
@Override
public void print() {
System.out.println("菜单:" + name);
for (MenuComponent component : menuComponents) {
component.print();
}
}
}
public class Client {
public static void main(String[] args) {
MenuComponent coffeeMenu = new Menu("咖啡菜单");
coffeeMenu.add(new MenuItem("美式咖啡"));
coffeeMenu.add(new MenuItem("拿铁"));
MenuComponent dessertMenu = new Menu("甜点菜单");
dessertMenu.add(new MenuItem("蛋糕"));
dessertMenu.add(new MenuItem("冰淇淋"));
MenuComponent allMenu = new Menu("总菜单");
allMenu.add(coffeeMenu);
allMenu.add(dessertMenu);
allMenu.print();
}
}
菜单:总菜单
菜单:咖啡菜单
菜单项:美式咖啡
菜单项:拿铁
菜单:甜点菜单
菜单项:蛋糕
菜单项:冰淇淋
✅ 客户端无需区分“单个对象”和“组合对象”
✅ 符合 开闭原则
✅ 非常适合 树形结构
如果你愿意,我也可以:
你想看哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。