设计模式-迭代器模式Interator--摘自武奇老师博客160305

原文地址:http://blog.csdn.net/risky78125/article/details/50443724


设计模式-迭代器模式Interator

概念:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

下面设计一个例子,演示迭代器模式的使用

  • 例如有下面一种情况,一个餐厅,有两个厨师.一个负责早餐,一个负责午餐.但是呢,两个师傅都非常有个性.一个师傅的菜单 (BreakfastMenu)是用集合(List进行表示的,而另一个师傅的菜单(LunchMenu)是用数组(MenuItem[]).如果此时, 服务员(Waitress)需要向客人展示菜单里的内容就非常的不方便,除非让两个厨师统一.但是之前说过了,师傅太有个性了,就不改.那么下面,使用代 码演示一下.

  • 首先,菜品类:

public class MenuItem {    private String name;    private double price;    public MenuItem(String name, double price) {        this.name = name;        this.price = price;
    }    public String getName() {        return name;
    }    public double getPrice() {        return price;
    }
    @Override    public String toString() {        return "MenuItem{" +                "name='" + name + '\'' +                ", price=" + price +                '}';
    }
}123456789101112131415161718192021

做早餐的师傅,菜单是用集合形式表示的

public class BreakfastMenu {    private List<MenuItem> menuItems;    public BreakfastMenu() {
        menuItems = new ArrayList<>();
        addItem("豆浆", 1.0);
        addItem("鸡蛋", 1.0);
        addItem("肉包子", 2.5);
        addItem("豆腐脑", 2.0);
    }    private void addItem(String name, double price) {
        MenuItem item = new MenuItem(name, price);
        menuItems.add(item);
    }    public List<MenuItem> getMenuItems() {        return menuItems;
    }
}1234567891011121314151617

做午餐的师傅,菜单是使用数组表示的

public class LunchMenu {    private static final int MAX_ITEMS = 3;    private MenuItem[] menuItems;    private int index;    public LunchMenu() {
        menuItems = new MenuItem[MAX_ITEMS];
        addItem("鸡排饭", 8.0);
        addItem("蛋炒饭", 7.0);
        addItem("白菜盖饭", 9.0);
    }    private void addItem(String name, double price) {
        MenuItem item = new MenuItem(name, price);
        menuItems[index] = item;
        index++;
    }    public MenuItem[] getMenuItems() {        return menuItems;
    }
}12345678910111213141516171819

此时,服务员的做法如下:

public class Waitress {    private BreakfastMenu breakfastMenu;    private LunchMenu lunchMenu;    public Waitress(BreakfastMenu breakfastMenu, LunchMenu lunchMenu) {        this.breakfastMenu = breakfastMenu;        this.lunchMenu = lunchMenu;
    }
  blic void printMenu(){
        printBreakfastMenu();
        printLunchMenu();
    }    public void printBreakfastMenu(){
    System.out.println("---早餐---");
        List<MenuItem> breakfast = breakfastMenu.getMenuItems();        for (int i = 0; i < breakfast.size(); i++) {
            System.out.println(breakfast.get(i));
        }
    }    public void printLunchMenu(){
        System.out.println("---午餐---");
        MenuItem [] lunch = lunchMenu.getMenuItems();        for (int i = 0; i < lunch.length; i++) {
            System.out.println(lunch[i]);
        }
    }
}1234567891011121314151617181920212223242526

执行程序如下:

public class Hotel {    public static void main(String[] args) {
        BreakfastMenu breakfastMenu = new BreakfastMenu();
        LunchMenu lunchMenu = new LunchMenu();
        Waitress waitress = new Waitress(breakfastMenu, lunchMenu);
        waitress.printMenu();
    }
}12345678
  • 可以看到,服务员(Waitress)分别遍历了两种集合,那如果再加个有个性的厨师呢?再来个用Map存储的,是不是还得再写一个遍历?

  • 下面,介绍迭代器(Interator)的用法

  • 首先,创建迭代器接口

public interface Iterator<T> {
    boolean hasNext();
    T next();
}1234

早餐菜单的实现类如下:

public class BreakfastMenuIterator implements Iterator<MenuItem> {
    private List<MenuItem> items;    private int index;    public BreakfastMenuIterator(List<MenuItem> items) {        this.items = items;
    }
    @Override    public boolean hasNext() {        if (index < items.size()) return true;        return false;
    }
    @Override    public MenuItem next() {        return items.get(index++);
    }
}12345678910111213141516

午餐菜单实现类如下:

public class LunchMenuIterator implements Iterator<MenuItem> {
    private MenuItem [] items;    private int index;    public LunchMenuIterator(MenuItem[] items) {        this.items = items;
    }
    @Override    public boolean hasNext() {        if (index < items.length) return true;        return false;
    }
    @Override    public MenuItem next() {
        MenuItem item = items[index++];        return item;
    }
}123456789101112131415161718

然后,分别在BreakfastMenu和LunchMenu类下面公布一个新方法,createInterator()

public class BreakfastMenu {
    /** 其余代码未变,省略 */
    public Iterator createIterator(){        return new BreakfastMenuIterator(menuItems);
    }
}123456

同样,LunchMenu

public class LunchMenu {
    /** 其余代码未变,省略 */
    public Iterator createIterator(){        return new LunchMenuIterator(menuItems);
    }
}123456

修改Waitree类

public class Waitress {    private final Iterator breakfastIterator;    private final Iterator dinerIterator;    public Waitress(BreakfastMenu breakfastMenu, LunchMenu lunchMenu) {
        breakfastIterator = breakfastMenu.createIterator();
        dinerIterator = lunchMenu.createIterator();
    }    public void printMenu(){
        printBreakfastMenu();
        printLunchMenu();
    }    private void print(Iterator iterator){        while (iterator.hasNext()){
            MenuItem item = (MenuItem) iterator.next();
            System.out.println(item.toString());
        }
    }    public void printBreakfastMenu(){
        System.out.println("---早餐---");
        print(breakfastIterator);
    }    public void printLunchMenu(){
        System.out.println("---午餐---");
        print(dinerIterator);
    }
}1234567891011121314151617181920212223242526272829

执行程序的代码无改动.
可以看到,此时Waitree类完全不用考虑菜单的类型,关心的只是是否实现了迭代器的接口.而其他的菜单类,只是添加了一个方法而已,对厨师来说,那只是小事儿一桩.
上面是咱们自己创建了一个迭代器,实际上在java中,系统有Interator这个接口,并且List/Map等集合类也都是有直接的方法来提供迭代器,例如:

List<MenuItem> breakfastMenus = new ArrayList<>();
        java.util.Iterator listIterator = breakfastMenus.iterator();
        Map<String,MenuItem> map = new HashMap<>();


转载于:https://my.oschina.net/u/2531415/blog/651421

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值