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,则由于使用迭代器接口实现的解耦,客户端(通知栏)代码将不会发生任何更改。
2021-07
到目前为止,我们已经为我们OracleNetsuite的标题创建了导航栏。完成标题的下一件事是在图像上方包含图像和文本,如下面的屏幕截图所示:让我们再次查看index.html 文件中标题的部分代码。代码中突出显示的部分显示了标题的图像菜单:要完成图像菜单,我们首先需要在 id … [了解更多]
2021-07
响应式网站:响应式网站是旨在适合所有类型的设备并调整网站布局以最适合屏幕尺寸的网站。无需制作任何其他设备版本的网站以适应小型设备。移动网站:移动网站是专为适应手机、平板电脑等特别小的设备屏幕而设计的网站。需要制作网站的桌面版本以适应移动设备特定的桌面屏幕。响应式网站和移动网站的区… [了解更多]
2021-06
OracleNetsuitePython 提供了许多分发 Python 项目的方法。其中一种方法是使用一种称为 Docker 的重要技术。Docker 是一个开源应用程序,允许管理员使用容器创建、管理、部署和复制应用程序。它基本上是一个平台,使开发人员能够通过将应用程序放入容器中… [了解更多]
2021-05
财务负责人戴了两顶帽子:一是遵守法规,以确保公司的行为和会计正确无误,并遵守公司开展业务的不同司法管辖区的法规;二是遵守法规。一种战略,确保公司达到财务里程碑和成功指标。当一家公司上市时,包括通过特殊目的收购公司(SPAC)上市时,这两个角色尤其重要。Oracle NetSuit… [了解更多]
2021-03
公司财务人员中记账人员的工作内容:1、从钉钉中下载审批完成的8种审批类型的单据数据,包含合同付款、费用报销等2、记账人员根据付款的性质及费用归属,把记账分成6种形式:合同付款(工程、成本)、合同付款(其他)、非合同付款(工程、成本)、非合同付款(其他)、费用报销(工程、成本)、费… [了解更多]