组合模式

组合模式

 

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
咖啡菜单---------------------
  拿铁  卡布奇诺  摩卡