很高兴,这本书总共13章,此次已是到第9章了;同时也很遗憾,小编脱离了书本,仍是不知道如何描述一个设计模式。就好比迭代器与组合模式,原书篇幅比较长,小编尽可能通俗易懂些,不到之处,还请各位小伙伴参考原书,小编也欢迎和你们一块儿交流。设计模式
有许多种方法能够把对象堆起来成为一个集合(collection)。你能够把它们放进数组、堆栈、列表或是散列表中,这是你的自由。每一种都有它本身的优势和适合的使用时机,但若是你想要遍历这些对象,怎么办呢?不用担忧,接下来的学习就是如何能让客户遍历你的对象而又没法窥视你存储对象的方式;也将学习如何建立一些对象超集合,可以一口气就跳过某些让人望而生畏的数据结构。数组
在面向对象的世界里,小伙伴们都开心的不要不要的,由于如今他们能够在同一个地方,享受煎饼屋美味的煎饼早餐,和好吃的餐厅午饭了。可是,有一点小麻烦......数据结构
煎饼屋记录的菜单项是使用数组来存储的,而餐厅是使用ArrayList记录他的菜单项,两家店长都不肯意改变如今的实现,毕竟有太多的代码依赖了,而咱们又想减小依赖,用最小的改动。学习
想了解为何有两种不一样的菜单表现方式会让事情变得复杂化,让咱们试着实现一个同时使用这两个菜单的客户代码。spa
咱们新聘请了一位服务员,能应对顾客的须要打印定制的菜单,甚至告诉你是否某个菜单项是素食的,而无需询问厨师。要求以下:设计
实现上来讲,以下所示:code
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();
DinerMenu dinerMenu = new DinerMenu();
MenuItem[] lunchItems = dinerMenu.getMenuItems();
复制代码
for (int i = 0; i < breakfastItems.size(); i++) {
MenuItem menuItem = (MenuItem)breakfastItems.get(i);
System.out.print(menuItem.getName());
System.out.println("\t\t" + menuItem.getPrice());
System.out.println("\t" + menuItem.getDescription());
}
for (int i = 0; i < lunchItems.length; i++) {
MenuItem menuItem = lunchItems[i];
System.out.print(menuItem.getName());
System.out.println("\t\t" + menuItem.getPrice());
System.out.println("\t" + menuItem.getDescription());
}
复制代码
他们都不想改变自身的实现,由于意味着要重写许多代码。因此,若是咱们可以找出一个方法,让他们的菜单实现一个相同的接口,这该多好呢。咱们试试看封装。cdn
这本书给咱们最大的改变,就是封装变化的部分。在这里发生的变化是:由不一样的集合类型所形成的遍历。能被封装吗?咱们继续来分析下:对象
for(int i = 0; i < breakfastItems.size(); i++) {
MenuItem menuItem = (MenuItem)breakfastItems.get(i);
}
复制代码
for (int i = 0; i < lunchItems.length; i++) {
MenuItem menuItem = lunchItems[i];
}
复制代码
Iterator iterator = breakfastMenu.createIterator();
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem) iterator.next();
}
复制代码
Iterator iterator = lunchMenu.createIterator();
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem) iterator.next();
}
复制代码
看到这里,能够看到,咱们对遍历的封装已经奏效了;你大概已经猜到,这正是一个设计模式,称为迭代器模式。那咱们放在下次来具体说说,等着噢。接口