设计模式(一)之迭代器模式Iterator

今天刚开始看设计模式,顺便写一下以便记忆,如果有幸被那位大师看到,指点一下便是我的万幸了!

 

我对设计模式的理解很肤浅,就是方便代码的开发与后期维护修改。它可以让人清楚自己在干什么和将要干什么,而不是稀里糊涂的遇见一个问题解决一个问题。因为很多后期的问题都是在前期开发时不注意方法造成的。若没有一个良好的设计规范,很容易造成软件腐烂。

迭代器模式Iterator:

迭代器模式可以循环遍历数组或集合,而且可以使应用与实现相分离。下面介绍一个例子:

我们假设有一个Book类和BookShelf类,我们可以查看书架上有哪些书。

Book类:

package iterator;

public class Book {
 private String name="";
 public Book(String name){
  this.name=name;
 }
 public String getName(){
  return name;
 }
}

BookShelf类:

package iterator;

public class BookShelf implements Aggregate{
 private Book[] books;
 private int last=0;
 
 public BookShelf(int maxSize) {
  this.books=new Book[maxSize];
 }
 public Book getBookAt(int index){
  return books[index];
 }
 public void appendBook(Book book){
  books[last]=book;
  last++;
 }
 public int getLength(){
  return last;
 }
 
 public Iterator iterator() {
  // TODO Auto-generated method stub
  return new BookShelfIterator(this);
 }
 
}

其实到了这里我们完全可以写一个Main类来遍历书架上的书,但是如果那样的话代码的耦合度就太高了。如何是Main类中的调用不与实现挂钩呢?可以用Iterator。

Iterator接口:

package iterator;

public interface Iterator {
 public abstract boolean hasNext();
 public abstract Object next();
}

Aggregate接口:

package iterator;

public interface Aggregate {
 public abstract Iterator iterator();
}
我们可以定义一个具体的类来实现Iterator接口:

BookShelfIterator类:

package iterator;

public class BookShelfIterator implements Iterator{
 private BookShelf bookShelf;
 private int index;

 public BookShelfIterator(BookShelf bookShelf) {
  this.bookShelf = bookShelf;
  this.index=0;
 }
 
 public boolean hasNext() {
  if(index<bookShelf.getLength()){
   return true;
  }
  return false;
 }

 public Object next() {
  Book book=bookShelf.getBookAt(index);
  index++;
  return book;
 }

}
这样我们可以直接调用Interator中的遍历方法来遍历书架上的书,这就大大地降低了代码的耦合度。

下面是测试类:

Main类:

package iterator;

public class Main {
 public static void main(String[] args) {
  BookShelf bookShelf=new BookShelf(4);
  bookShelf.appendBook(new Book("第一本书"));
  bookShelf.appendBook(new Book("第二本书"));
  bookShelf.appendBook(new Book("第三本书"));
  bookShelf.appendBook(new Book("第四本书"));
//  bookShelf.appendBook(new Book("第五本书"));
  Iterator it=bookShelf.iterator();
  while (it.hasNext()) {
   Book book = (Book) it.next();
   System.out.println(book.getName());
  }
 }
}

至此整个程序结束。

但是要注意,我们在BookShelf类中用数组来放置书本,因数组空间一旦确定就不能改变在Main测试类中当你试图添加第五本书时,程序会抛出数组越界异常。因此我们最好改用Vector类或List接口的实现类来实现。

你可以将BookShelf类中的内容改为下面的代码:

package iterator;

import java.util.ArrayList;
import java.util.List;

public class BookShelf implements Aggregate{
 private List<Book> books;
 
 public BookShelf(int maxSize) {
  this.books=new ArrayList<Book>(maxSize);
 }
 public Book getBookAt(int index){
  return books.get(index);
 }
 public void appendBook(Book book){
  books.add(book);
 }
 public int getLength(){
  return books.size();
 }
 
 public Iterator iterator() {
  // TODO Auto-generated method stub
  return new BookShelfIterator(this);
 }
 
}

现在你可以放心的在Main类中多添加一些书本而不会再报数组越界异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值