Design Pattern 之 迭代器模式

本文通过实例展示了迭代器模式如何在餐厅菜单管理中实现统一访问不同类型的菜单内容,包括中餐和西餐菜单,同时提供了迭代器接口、菜单类及具体迭代器类的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

适用性

访问一个聚合对象的内容而无需暴露它的内部表示
支持对聚合对象的多种遍历
为遍历不同的聚合结构提供一个统一的接口

类图

这里写图片描述

示例

比如说餐厅中有一份中餐菜单是用vector存储,一份西餐菜单是用数组存储,现在要求我们为餐厅服务员提供一个统一的接口来访问这两个菜单的内容,这时候就可以用

到迭代器模式了

代码

中餐菜单:

package com.org.Iterator;

import java.util.Vector;

public class ChineseFoodMenu
{
    public Vector<String> vtrMeun;

    public ChineseFoodMenu()
    {
        if (vtrMeun == null)
        {
            vtrMeun = new Vector<String>();
            vtrMeun.add("鱼香肉丝");
            vtrMeun.add("红烧茄子");
            vtrMeun.add("水煮肉片");
        }

    }

    public Iterator CreateIterator()
    {
        return new ChineseFoodMenuIterator(vtrMeun);
    }
}

西餐菜单:

package com.org.Iterator;

public class WestFoodMenu
{
    public String[] vtrMenu;

    public WestFoodMenu()
    {
        vtrMenu = new String[3];
        vtrMenu[0] = "牛排";
        vtrMenu[1] = "通心粉";
        vtrMenu[2] = "披萨";
    }

    public Iterator CreateIterator()
    {
        return new WestFoodMenuIterator(vtrMenu);
    }
}

Iterator接口

package com.org.Iterator;

public interface Iterator
{
    public Object Next();
    public Object First();
    public Object Last();
    public Object Current();
    public boolean HasNext();
}

中餐菜单迭代器:

package com.org.Iterator;

import java.util.Vector;

public class ChineseFoodMenuIterator implements Iterator
{
    private Vector<String> m_vtrMenu;
    private int            nIndex;

    public ChineseFoodMenuIterator(Vector<String> vtrMenu)
    {
        nIndex = 0;
        m_vtrMenu = vtrMenu;
    }

    @Override
    public Object Next()
    {

        if(HasNext())
        {
            Object obj = m_vtrMenu.get(nIndex);

            nIndex++;

            return obj;
        }

        return null;
    }

    @Override
    public Object First()
    {
        return m_vtrMenu.firstElement();
    }

    @Override
    public Object Last()
    {
        return m_vtrMenu.lastElement();
    }

    @Override
    public boolean HasNext()
    {
        if(nIndex < m_vtrMenu.size())
        {
            return true;
        }

        return false;
    }

    @Override
    public Object Current()
    {
        if(HasNext())
        {
            return m_vtrMenu.get(nIndex);
        }

        return null;
    }

}

西餐菜单迭代器:

package com.org.Iterator;

public class WestFoodMenuIterator implements Iterator
{
    private String[] m_vtrMenu;
    private int nIndex;

    public WestFoodMenuIterator(String[] vtrMenu)
    {
        nIndex = 0;
        m_vtrMenu = vtrMenu;
    }

    @Override
    public Object Next()
    {

        if (HasNext())
        {
            Object obj = m_vtrMenu[nIndex];

            nIndex++;

            return obj;
        }

        return null;
    }

    @Override
    public Object First()
    {
        return m_vtrMenu[0];
    }

    @Override
    public Object Last()
    {
        return m_vtrMenu[m_vtrMenu.length - 1];
    }

    @Override
    public boolean HasNext()
    {
        if (nIndex < m_vtrMenu.length)
        {
            return true;
        }

        return false;
    }

    @Override
    public Object Current()
    {
        if (HasNext())
        {
            return m_vtrMenu[nIndex];
        }

        return null;
    }

}

服务员使用时:

package com.org.Iterator;

public class Waiter
{
    public static void main(String[] args)
    {
        Iterator iter = new ChineseFoodMenu().CreateIterator();
        printMenu(iter);

        Iterator iter1 = new WestFoodMenu().CreateIterator();
        printMenu(iter1);
    }

    public static void printMenu(Iterator iter)
    {
        while(iter.HasNext())
        {
            System.out.println(iter.Next().toString());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啸鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值