组合模式
组合模式
1树结构
2:对象组合成树结构来表现整体/部分层数结构,让客户一致的方式处理个别对象和对象组合
组合:包含组件,也就是当前节点的所有子节点,包括当前节点
组件:包括组合和叶子节点
3:允许客户对个别对象(叶子节点)以及组合对象(非叶子节点)一视同仁
3图
案例遍历菜单
代码
public abstract class MenuComponent {
/**
*
* 描述:
* @param 添加
*/
public void add(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
/**
*
* 描述:
* @param 删除
*/
public void remove(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
/**
*
* 描述:
* @param 获取子节点
*/
public MenuComponent getChild(int i) {
throw new UnsupportedOperationException();
}
/**
*
* 描述: 获取迭代器
* @param
*/
public abstract Iterator createIterator();
public void print() {
throw new UnsupportedOperationException();
}
public String getName() {
throw new UnsupportedOperationException();
}
public class Menu extends MenuComponent {
ArrayList menuComponents = new ArrayList();
String name;
public Menu(String name) {
this.name = name;
}
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
public MenuComponent getChild(int i) {
return (MenuComponent) menuComponents.get(i);
}
public String getName() {
return name;
}
public Iterator createIterator() {
return menuComponents.iterator();
}
public void print() {
System.out.println();
System.out.println(getName()+"---------------------");
Iterator iterator = menuComponents.iterator();
while (iterator.hasNext()) {//递归打印
MenuComponent menuComponent = (MenuComponent) iterator.next();
menuComponent.print();
}
}
}
public class MenuItem extends MenuComponent {
String name;
public MenuItem(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Iterator createIterator() {
return new NullIterator();
}
public void print() {
System.out.print(" " + getName());
}
}
public class Waitress {
MenuComponent allMenus;
public Waitress(MenuComponent allMenus) {
this.allMenus = allMenus;
}
public void printMenu() {
allMenus.print();
}
}
测试
public class MenuTestDrive {
public static void main(String args[]) {
MenuComponent pancakeHouseMenu = new Menu("煎饼菜单");
MenuComponent dinerMenu = new Menu("餐厅菜单");
MenuComponent cafeMenu = new Menu("咖啡菜单");
MenuComponent dessertMenu = new Menu("甜点菜单");
MenuComponent allMenus = new Menu("all Menus");
allMenus.add(pancakeHouseMenu);
allMenus.add(dinerMenu);
allMenus.add(cafeMenu);
pancakeHouseMenu.add(new MenuItem("牛肉煎饼"));
pancakeHouseMenu.add(new MenuItem("鱼肉煎饼"));
pancakeHouseMenu.add(new MenuItem("鸡蛋煎饼"));
dinerMenu .add(new MenuItem("牛排"));
dinerMenu .add(new MenuItem("牛肉片"));
dinerMenu .add(new MenuItem("牛骨"));
dessertMenu.add(new MenuItem("甜点1"));
dessertMenu.add(new MenuItem("甜点2"));
dessertMenu.add(new MenuItem("甜点3"));
dinerMenu.add(dessertMenu);
cafeMenu.add(new MenuItem("拿铁"));
cafeMenu.add(new MenuItem("卡布奇诺"));
cafeMenu.add(new MenuItem("摩卡"));
Waitress waitress = new Waitress(allMenus);
waitress.printMenu();
}
}
结果:
all Menus---------------------
煎饼菜单---------------------
牛肉煎饼 鱼肉煎饼 鸡蛋煎饼
餐厅菜单---------------------
牛排 牛肉片 牛骨 甜点菜单---------------------
甜点1 甜点2 甜点3
咖啡菜单---------------------
拿铁 卡布奇诺 摩卡