package menu;
import java.util.ArrayList;
import java.util.Iterator;
public class Menu extends MenuComponent {
ArrayList<MenuComponent> menuComponents=new ArrayList<MenuComponent>();
String name;
String description;
public Menu(String name,String description){
this.name=name;
this.description=description;
}
@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 void print() {
System.out.print("\n"+name);
System.out.println(", "+description);
System.out.println("----------------------");
Iterator<MenuComponent> iterator=menuComponents.iterator();
while(iterator.hasNext()){
MenuComponent component=iterator.next();
component.print();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public Iterator<MenuComponent> createIterator() {
return menuComponents.iterator();
}
}
package menu;
import java.util.Iterator;
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 String getDescription(){
throw new UnsupportedOperationException();
}
public double getPrice(){
throw new UnsupportedOperationException();
}
public boolean isVegetarian(){
throw new UnsupportedOperationException();
}
public void print(){
throw new UnsupportedOperationException();
}
public Iterator<MenuComponent> createIterator(){
throw new UnsupportedOperationException();
}
}
package menu;
public class MenuItem extends MenuComponent {
String name;
String description;
boolean vegetarian;
double price;
public MenuItem(String name,String description,boolean vegetarian,double price) {
this.name=name;
this.description=description;
this.vegetarian=vegetarian;
this.price=price;
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public boolean isVegetarian() {
return vegetarian;
}
public void setVegetarian(boolean vegetarian) {
this.vegetarian = vegetarian;
}
@Override
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public void print() {
System.out.print(" "+getName());
if(isVegetarian()){
System.out.println("(v)");
}
System.out.println(", "+getPrice());
System.out.println(" -- "+getDescription());
}
}
package iterator;
import java.util.Iterator;
import java.util.Stack;
import menu.Menu;
import menu.MenuComponent;
public class CompositeIterator implements Iterator<MenuComponent>{
Stack<Iterator<MenuComponent>> stack=new Stack<Iterator<MenuComponent>>();
public CompositeIterator(Iterator<MenuComponent> iterator) {
stack.push(iterator);
}
@Override
public boolean hasNext() {
if(stack.isEmpty()){
return false;
}else{
Iterator<MenuComponent> iterator=stack.peek();//取栈顶
if(!iterator.hasNext()){//如果没有下个元素,就将其出栈
stack.pop();
return hasNext();
}else{
return true;
}
}
}
@Override
public MenuComponent next() {
if(hasNext()){
Iterator<MenuComponent> iterator=stack.peek();
MenuComponent menuComponent=iterator.next();
if(menuComponent instanceof Menu){//如果不是叶结点就将当前节点入栈
stack.push(menuComponent.createIterator());
}
return menuComponent;
}else{
return null;
}
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
分享到:
相关推荐
迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中有着广泛的应用。这两种模式都属于GoF(Gang of Four)设计模式,旨在解决特定的问题,提升代码...
### Java 23种设计模式之...- **组合迭代器**:可以组合多个迭代器,用于遍历由多个聚合对象组成的复合结构。 通过上述内容,我们可以看到迭代器模式不仅解决了访问聚合对象的问题,还提高了代码的可读性和可维护性。
在这个主题中,我们主要探讨了如何利用组合模式(Composite Pattern)构建二叉树,并通过迭代器模式(Iterator Pattern)来实现对树的遍历,包括前序、中序和后序遍历。这些是设计模式中的经典应用,对于理解和掌握...
4. **组合迭代器**:`nanoiterator.chain()`方法可以将多个迭代器链接在一起,形成一个单一的迭代流。 5. **停止迭代器**:`nanoiterator.stop()`用于在迭代过程中提前结束,这在某些条件满足时很有用。 **四、...
在实际应用中,迭代器模式常用于各种容器(如数组、链表、树等)的遍历,以及模板方法模式、策略模式等设计模式的组合。例如,在Java的`Collections`类中,有许多方法(如`sort()`、`shuffle()`)都依赖于迭代器来...
这份文档以例子的形式讲诉了设计模式之迭代器与组合模式,希望可以帮助学习的人!
4. **组合迭代器**:如`product`, `zip_longest`等,实现了笛卡尔积和灵活的zip操作,即使输入的迭代器长度不一致也能处理。 5. **分组迭代器**:如`groupby`, `chunked`等,可以将迭代器中的元素按特定规则分组或...
迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,不同类型的迭代器支持不同的操作,例如: 1. 输入迭代器只能读取元素,不能修改。 2. 输出迭代器只能写入元素,不能读取。 3. 前向...
而与Composite(组合)模式的联系在于迭代器通常用于递归地遍历组合结构。 迭代器模式在Java中有着广泛的应用。Java内置了对迭代器模式的支持,其中java.util.Enumeration和java.util.Iterator接口就是迭代器接口。...
《HeadFirst JAVA设计模式》中利用迭代器迭代组合模式存在错误,课本中实现代码对于大于两层的树状测试数据存在错误(即Menu里有Menu),这里给出原错误测试代码(compositeIter包)和错误解决代码(solveIter包)。
### Python迭代器与生成器详解 #### 手动创建迭代器 在Python中,迭代器是一种可以记住遍历位置的对象。一个数据集合类的对象通常可以通过迭代器方式访问其内部每一个项目。迭代器有两种基本的方法:`__iter__()` ...
II、N皇后 II、子集 II、全排列 II、黄金矿工、组合总和 II、将数组拆分成斐波那契序列、活字印刷、计算各个位数不同的数字个数、二进制手表、格雷编码、串联字符串的最大长度、顺次数、字母组合迭代器、近义词句子...
在ES6中,迭代器和生成器是两个重要的特性,它们极大地增强了JavaScript处理数据和控制流的能力。 **迭代器** 迭代器是专门用于遍历集合(如数组、对象等)的机制,它遵循一个特定的接口,即拥有`next()`方法。这...
- **Page369: 组合迭代器**:展示了如何结合使用迭代器和组合模式来遍历复合对象。 #### 10. 状态模式 - **第10章:状态模式**: - 状态模式允许对象在其内部状态改变时改变其行为。对象看起来似乎修改了它的类。...
### Rust 编程艺术:迭代器与闭包的精妙运用 #### 一、Rust 语言概述 Rust 是一种高性能的系统级编程语言,它由 Mozilla 研究院发起,Graydon Hoare 设计,并于 2010 年首次发布。Rust 的设计目标在于提供内存安全...
本文将深入探讨四种重要的Python高级特性:列表推导式、迭代器、生成器以及装饰器。 首先,列表推导式是Python中一种简洁且高效的创建列表的方式。它允许我们通过一行代码完成原本需要多行代码才能实现的列表构建。...
27. 字母组合迭代器:这是一个常见的数据结构问题,要求设计一种迭代器,可以迭代遍历一个字母组合。 28. 力扣排行榜:这是一个系统设计题,要求设计一个力扣排行榜系统,能够实现用户排名和排行榜的功能。 29. ...
这是map和flatMap的组合,它将每个元素映射为一个迭代器或数组,然后将其展开成一个单一的迭代器。这在你需要扁平化嵌套的数据结构时很有用,例如,将包含子数组的数组转换为单级数组。 5. **异步Pipe(asyncPipe...
接下来,我们将讨论迭代器中的排列组合。在Python中,`itertools.permutations()`函数用于生成一个列表的所有可能排列,而`itertools.combinations()`则用于生成组合。例如,对于`['a', 'b', 'c']`,要生成所有两...
在这个"2用迭代器访问像素"的主题中,我们将深入探讨如何在Visual Studio(VS)环境下,利用OpenCV库通过迭代器来访问和操作图像中的每一个像素。 首先,我们需要了解OpenCV中的基本数据结构`cv::Mat`。`cv::Mat`是...