Java23种设计模式笔记1
2018-06-18 02:42:40来源:未知 阅读 ()
Iterator模式
1.1 Iterator模式
使用Java语言显示数组arr中的元素代码如下:
1 for (int i = 0;i<arr.length;i++) 2 { 3 Systm.out.println(arr[i]); 4 }
数组中保存了很多元素。通过指定数组下标,我们可以从中选择任意一个元素。
for语句中的 i++ 的作用是让 i 的值在每次循环后自增 1,这样就可以访问数组中的下一个元素、下下个元素、再下下个元素,实现从头到尾逐一遍历数组元素的功能。
将这里的循环变量 i 的作用抽象化、通用化后形成的模式,在设计模式中成为lterator模式。
Iterator模式用于在数据集合中按照顺序遍历集合,简称“迭代器”模式。
1.2 示例程序
作用:将书放置到书架中,并将书的名字按顺序显示出来。
Aggregate接口
Aggregate接口是所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合,就像数组一样。Aggregate有使聚集,集合的意思。
------------------------------------------------------------
名字 说明
Aggregate 表示集合的接口
Iterator 遍历集合的接口
Book 表示书的类
BookShelf 表示书架的类
BookShelfIterator 遍历书架的类
Main 测试程序行为的类
-------------------------------------------------------------
1 public interface Aggregate 2 { 3 public abstract Iterator iterator(); 4 }
在Aggregate接口声明中的方法只有一个 iterator方法。该方法会生成一个用于遍历集合的迭代器。想要遍历集合中的元素时,可以调用 iterator方法来生成一个实现了Iterator接口的类的实例。
Iterator接口
Iterator接口用于遍历集合中的元素,其作用相当于循环语句中的循环变量。Iterator接口的定义方式有很多种。
1 public interface Iterator 2 { 3 public abstract boolean hasNext(); 4 public abstract Object next(); 5 }
这里声明了两个方法,判断是否存在下一个元素的hasNext方法和获取下一元素的next方法。
hasNext方法:返回值boolean类型;当集合中存在下一个元素,返回true,当集合中不存在下一个元素,返回false。hasNext主要用于循环终止。
next方法:返回类型为Object类型,返回的是集合中的一个元素;为了能够在下次调用next方法时正确的返回下一个元素,该方法中还隐含着将迭代器移动至下一个元素的处理。
Book类
Book类是表示书的类,主要实习的功能是通过getName方法获取书的名字。
1 public class Book 2 { 3 private String name; 4 public Book(String name) 5 { 6 this.name = name; 7 } 8 public String getName() 9 { 10 return name; 11 } 12 }
BookShelf类
BookShelf类表示书架的类。由于需要将该类作为集合进行处理,因此它实现了Aggregate接口,如代码中的 implements Aggregate。外在BookShelf类中还实现了Aggregate接口的iterator方法。
1 public class BookShelf implements Aggregate //implements实现一个接口的关键字 2 { 3 private Book[] books; 4 private int last = 0; 5 public BookShelf(int maxsize) 6 { 7 this.books = new Book[maxsize]; 8 } 9 public Book getBookAt(int index) 10 { 11 return books[index]; 12 } 13 public void appendBook(Book book) 14 { 15 this.books[last] = book; 16 last++; 17 } 18 public int getLength() 19 { 20 return last; 21 } 22 public Iterator iterator() 23 { 24 return new BookShelfIterator(this); 25 } 26 }
这个书架中定义了books字段,它是Book类型的数组,数组的大小maxsize在生成BookShelf实例时就被指定了,将books字段的可见性设置为private,是为了防止外部不小心改变了该字段的值。iterator方法会生成并返回BookShelfIterator类的实例作为BookShelf类对应的Iterator。当外部想要遍历书架时,就会调用这个方法。
BookShelfIterator类
1 public class BookShelfIterator implements Iterator 2 { 3 private BookShelf bookShelf; 4 private int index; 5 public BookShelfIterator(BookShelf bookShelf) 6 { 7 this.bookShelf = bookShelf; 8 this.index = 0; 9 } 10 public boolean hasNext() 11 { 12 if (index<bookShelf.getLength()) 13 { 14 return true; 15 } 16 else 17 { 18 return false; 19 } 20 } 21 public Object next() 22 { 23 Book book = bookShelf.getBookAt(index); 24 index++; 25 return book; 26 } 27 }
因为BookShelfIterator类需要发挥Iterator的作用,所以它实现了Iterator接口。bookShelf字段鄙视BookShelfIterator所要遍历的书架。index字段表示迭代器当前所指向的书架的下标。
构造函数会将接收到的BookShelf的实例保存在bookShelf字段中,并将index初始化为0。
hasNext方法是Iterator接口中所生命的方法。该方法将会判断书架中还有没有下一本书,如果有,就返回true,如果没有就返回false。而要知道有没有下一本书,可以通过比较index和书架中书的总册数(bookShelf.getLength()的返回值)来判断。
next方法会返回迭代器当前所指向的书(Book的实例),并让迭代器指向下一本书。它也是Iterator接口中所声明的方法。next方法稍微有些复杂,它首先取出book变量作为返回值,然后让index指向后面一本书。
如果与本章开头的for语句来比,这里的 “让index指向后面一本书”的处理相当于其中i++,它让循环变量指向下一个元素。
Main类
至此,遍历书架的准备工作就完成了。接下来使用Main类来制作一个书架。
1 public class Main 2 { 3 public static void main(String[] args) 4 { 5 BookShelf bookShelf = new BookShelf(4); 6 bookShelf.appendBook(new Book("Around the World in 80 Days")); 7 bookShelf.appendBook(new Book("Bible")); 8 bookShelf.appendBook(new Book("Cinderella")); 9 bookShelf.appendBook(new Book("Daddy_Long_Legs")); 10 Iterator it = biikShelf.iterator(); 11 while(it.hasNext()) 12 { 13 Book BOOK = =(Book)it .next(); 14 System.out.println(book.getName()); 15 } 16 } 17 }
这段程序首先设计了能容纳4本书的书架,然后按书名的英文字母依次向书架中放入了4本书,通过bookShelf.iterator()得到的 it 是用于遍历书架的Iterator实例。while()部分的条件是判断书架上有没有下一本书,只要书架上有书,while循环就不会停止。然后,程序通过it.next()一本一本遍历书架中的书。
1.3 Iterator模式中的登场角色
Iterator(迭代器)
该角色负责定义桉顺序逐个遍历元素的接口(API)。在程序中,Iterator接口扮演这个角色,它定义了hasNext和next两个方法,其中,hasNext方法用于判断是否存在下一个元素,next方法则用于获取该元素。
ConcreteIterator(具体的迭代器)
该角色负责实现Iterator角色所定义的接口(API)。在程序中,BookShelfIlterator类扮演该角色。该角色中包含了遍历集合所必须的信息。在程序中,BookShelf类的实例保存在bookShelf字段中,被指向的数的下标保存在index字段中。
Aggregate(集合)
该角色负责定义创建Iterator角色的接口(API)。这个接口是一个方法,会创建出“按顺序访问保存在我内部元素的人”。在程序中,由Aggregate接口扮演这个角色,它里面定义了iterator方法。
ConcreteAggregate(具体的集合)
该角色负责实现Aggregate角色所定义的接口(API)。它会创建出具体的Iterator角色,即ConcreteIterator角色。在程序中,由BookShelf类扮演这个角色,它实现了iterator方法。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:java实现版本比较
下一篇:SpringBoot就是这么简单
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Ap 2020-06-11
- Java笔记:集合 2020-06-10
- Java基础语法菜鸟教程笔记 2020-06-10
- 设计模式-委派/策略模式 2020-06-09
- 黑菜菌的JAVA学习笔记 2020-06-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash