app开发公司软件设计的迭代器模式

今天我们成都app开发公司介绍一下迭代器模式是一种相对简单且经常使用的设计模式。每种语言都有很多数据结构/集合。每个集合都必须提供一个迭代器,让迭代器遍历其对象。但是,在执行此操作时,应确保它不会公开其实现。
假设我们正在构建一个需要我们维护通知列表的应用程序。最终,您的代码的某些部分将需要迭代所有通知。如果我们将您的通知集合实现为数组,您将迭代它们:
 
//如果使用简单数组存储通知
for(int i = 0; i <notificationList.length; i ++)
     通知通知= notificationList [i]);
 
//如果使用ArrayList是Java,那么我们将迭代
//在他们身上:
for(int i = 0; i <notificationList.size(); i ++)
    通知通知=(通知)notificationList.get(i);
如果它是一些其他集合,如集合,树等迭代方式会略有变化。现在,如果我们构建一个迭代器,它提供了一种迭代集合的通用方法,而不依赖于它的类型。
 
//创建一个迭代器
Iterator iterator = notificationList.createIterator();
 
//如果list是Array或ArrayList或者是无关紧要的
// 还要别的吗。
while(iterator.hasNext())
{
    通知通知= iterator.next());
}
迭代器模式让我们做到这一点。形式上它定义如下:
迭代器模式提供了一种访问聚合对象元素而不暴露其底层表示的方法。
 
类图:
 
 
在这里,我们为客户端提供了一个通用接口Aggregate,因为它将它与对象集合的实现分离开来。ConcreteAggregate实现createIterator(),返回其集合的迭代器。每个ConcreteAggregate的职责是实例化一个可以迭代其对象集合的ConcreteIterator。迭代器接口提供了一组遍历或修改集合的方法,除了next()/ hasNext()之外,它还可以提供搜索,删除等功能。
让我们通过一个例子来理解这一点。假设我们在应用程序中创建一个通知栏,显示通知集合中保存的所有通知。NotificationCollection提供了一个迭代器来遍历其元素,而不会暴露它如何将集合(在本例中为数组)实现到客户端(NotificationBar)。
 
 
类图将是:
 
 
 
下面是相同的Java实现:
 
filter_none
 
play_arrow
 
brightness_4
// A Java program to demonstrate implementation 
// of iterator pattern with the example of 
// notifications 
  
// A simple Notification class 
class Notification 
    // To store notification message 
    String notification; 
  
    public Notification(String notification) 
    { 
        this.notification = notification; 
    } 
    public String getNotification() 
    { 
        return notification; 
    } 
  
// Collection interface 
interface Collection 
    public Iterator createIterator(); 
  
// Collection of notifications 
class NotificationCollection implements Collection 
    static final int MAX_ITEMS = 6; 
    int numberOfItems = 0; 
    Notification[] notificationList; 
  
    public NotificationCollection() 
    { 
        notificationList = new Notification[MAX_ITEMS]; 
  
        // Let us add some dummy notifications 
        addItem("Notification 1"); 
        addItem("Notification 2"); 
        addItem("Notification 3"); 
    } 
  
    public void addItem(String str) 
    { 
        Notification notification = new Notification(str); 
        if (numberOfItems >= MAX_ITEMS) 
            System.err.println("Full"); 
        else
        { 
            notificationList[numberOfItems] = notification; 
            numberOfItems = numberOfItems + 1; 
        } 
    } 
  
    public Iterator createIterator() 
    { 
        return new NotificationIterator(notificationList); 
    } 
  
// We could also use Java.Util.Iterator 
interface Iterator 
    // indicates whether there are more elements to 
    // iterate over 
    boolean hasNext(); 
  
    // returns the next element 
    Object next(); 
  
// Notification iterator 
class NotificationIterator implements Iterator 
    Notification[] notificationList; 
  
    // maintains curr pos of iterator over the array 
    int pos = 0; 
  
    // Constructor takes the array of notifiactionList are 
    // going to iterate over. 
    public  NotificationIterator (Notification[] notificationList) 
    { 
        this.notificationList = notificationList; 
    } 
  
    public Object next() 
    { 
        // return next element in the array and increment pos 
        Notification notification =  notificationList[pos]; 
        pos += 1; 
        return notification; 
    } 
  
    public boolean hasNext() 
    { 
        if (pos >= notificationList.length || 
            notificationList[pos] == null) 
            return false; 
        else
            return true; 
    } 
  
// Contains collection of notifications as an object of 
// NotificationCollection 
class NotificationBar 
    NotificationCollection notifications; 
  
    public NotificationBar(NotificationCollection notifications) 
    { 
        this.notifications = notifications; 
    } 
  
    public void printNotifications() 
    { 
        Iterator iterator = notifications.createIterator(); 
        System.out.println("-------NOTIFICATION BAR------------"); 
        while (iterator.hasNext()) 
        { 
            Notification n = (Notification)iterator.next(); 
            System.out.println(n.getNotification()); 
        } 
    } 
  
// Driver class 
class Main 
    public static void main(String args[]) 
    { 
        NotificationCollection nc = new NotificationCollection(); 
        NotificationBar nb = new NotificationBar(nc); 
        nb.printNotifications(); 
    } 
输出:
 
-------通知栏------------
通知1
通知2
通知3
请注意,如果我们使用ArrayList而不是Array,则由于使用迭代器接口实现的解耦,客户端(通知栏)代码将不会发生任何更改。

需要软件开发就找我们吧!
 
18215660330
179001057@qq.com