热门关键词:

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

添加时间:2019-08-02 18:04:33

来源:

浏览:

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,则由于使用迭代器接口实现的解耦,客户端(通知栏)代码将不会发生任何更改。


用户名 Name
评论 Comment

软件开发  相关内容

——
02

2019-08

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

迭代器模式是一种相对简单且经常使用的设计模式。每种语言都有很多数据结构/集合。每个集合都必须提供一个迭代器,让迭代器遍历其对象。但是,在执行此操作时,应确保它不会公开其实现。假设我们正在构建一个需要我们维护通知列表的应用程序。最终,您的代码的某些部分将需要迭代所有通知。如果我们将… [了解更多]

03

2019-07

纪念差一点改变世界的coreseek的错

Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可以免费下载使用整理了coreseek/s… [了解更多]

24

2019-06

软件开发如何防止反射,序列化和克隆的单例

反射: 可以导致反射破坏单例类的单例属性,如下例所示:filter_none编辑play_arrowbrightness_4// Java code to explain effect of Reflection// on Singleton propertyimport jav…… [了解更多]

24

2019-06

软件开发的装饰者模式

所以我们现在要做的就是拿一个比萨饼并在运行时用装饰“装饰”它:拿一个比萨饼的对象。piz1用Capsicum对象“装饰”它。PIZ2用CheeseBurst对象“装饰”它。piz3调用getCost()并使用委托而不是继承来计算浇头成本。装饰图案我们最终得到的是一个披萨配奶酪爆米… [了解更多]

关注

成都软件开发

  • 地 址:成都市人民南路四段成科西路三号 863国家孵化园
  • 电 话:18215 660330
  • 手机:18215 660330
  • 传 真:18215 660330
  • 邮 箱:179001057@qq.com
  • 邮政编码:610000