`
linsea
  • 浏览: 87711 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

迭代器模式

阅读更多
迭代器模式
定义:提供一种顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示.

迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示.
把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和实现,
也让责任各得其所.

OO原则:一个类应该只有一个引起变化的原因.
此原则告诉我们,尽量让每个类保持单一责任.
类的每个责任都有改变的潜在区域.超过一个责任,意味着超过一个改变的区域.

内聚(cohesion): 它用来度量一个类或模块紧密地达到单一目的或责任.
当一个模块或一个类被设计成只支持一组相关的功能时,我们说它具有高内聚;
反之,当被设计成支持一组不相关的功能时,我们说它具有低内聚.

内聚是一个比单一责任原则更普遍的概念,但两者其实关系是很密切的.遵守这个
原则的类容易具有很高的凝聚力,而且比背负许多责任的低内聚类更容易维护.


package desginpattern.iterator;

public interface Iterator {
	boolean hasNext();
	Object next();
}


package desginpattern.iterator;

public class DinerMenuIterator implements Iterator {
	MenuItem[] items;
	int position = 0;
 
	public DinerMenuIterator(MenuItem[] items) {
		this.items = items;
	}
 
	public Object next() {
		MenuItem menuItem = items[position];
		position = position + 1;
		return menuItem;
	}
 
	public boolean hasNext() {
		if (position >= items.length || items[position] == null) {
			return false;
		} else {
			return true;
		}
	}
}


package desginpattern.iterator;

public class Waitress {
	PancakeHouseMenu pancakeHouseMenu;
	DinerMenu dinerMenu;
 
	public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) {
		this.pancakeHouseMenu = pancakeHouseMenu;
		this.dinerMenu = dinerMenu;
	}
 
	public void printMenu() {
		Iterator pancakeIterator = pancakeHouseMenu.createIterator();
		Iterator dinerIterator = dinerMenu.createIterator();

		System.out.println("MENU\n----\nBREAKFAST");
		printMenu(pancakeIterator);
		System.out.println("\nLUNCH");
		printMenu(dinerIterator);
	}
 
	private void printMenu(Iterator iterator) {
		while (iterator.hasNext()) {
			MenuItem menuItem = (MenuItem)iterator.next();
			System.out.print(menuItem.getName() + ", ");
			System.out.print(menuItem.getPrice() + " -- ");
			System.out.println(menuItem.getDescription());
		}
	}
 
	public void printVegetarianMenu() {
		printVegetarianMenu(pancakeHouseMenu.createIterator());
		printVegetarianMenu(dinerMenu.createIterator());
	}
 
	public boolean isItemVegetarian(String name) {
		Iterator breakfastIterator = pancakeHouseMenu.createIterator();
		if (isVegetarian(name, breakfastIterator)) {
			return true;
		}
		Iterator dinnerIterator = dinerMenu.createIterator();
		if (isVegetarian(name, dinnerIterator)) {
			return true;
		}
		return false;
	}


	private void printVegetarianMenu(Iterator iterator) {
		while (iterator.hasNext()) {
			MenuItem menuItem = (MenuItem)iterator.next();
			if (menuItem.isVegetarian()) {
				System.out.print(menuItem.getName());
				System.out.println("\t\t" + menuItem.getPrice());
				System.out.println("\t" + menuItem.getDescription());
			}
		}
	}

	private boolean isVegetarian(String name, Iterator iterator) {
		while (iterator.hasNext()) {
			MenuItem menuItem = (MenuItem)iterator.next();
			if (menuItem.getName().equals(name)) {
				if (menuItem.isVegetarian()) {
					return true;
				}
			}
		}
		return false;
	}
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics