Java 中的设计模式——迭代器模式
原文:https://www . geesforgeks . org/design-patterns-in-Java-iterator-pattern/
一个设计模式被证明是解决特定问题/任务的解决方案。我们需要记住,设计模式是独立于编程语言的,用于解决常见的面向对象设计问题。换句话说,设计模式代表一个想法,而不是一个特定的实现。使用设计模式可以使您的代码更加灵活、可重用和可维护。
设计模式的类型:Java 中有 3 种类型的设计模式,下面以表格的形式描述得更清楚。
- 行为设计模式
- 创新设计模式
- 结构设计模式
行为–迭代器模式
这里我们将通过一个例子来讨论迭代器模式。
- 迭代器模式是一个很好的模式,可以在不暴露对象结构的情况下提供导航。
- 穿过一个集装箱。在 Java 和大多数当前的编程语言中,都有集合的概念。列表、地图、集合都是我们想要遍历的集合的示例。历史上,我们使用某种类型的循环和索引到您的集合中来遍历它。
- 不会暴露我们想要导航的对象的底层结构。导航各种结构可能有不同的算法或方法来循环数据。
- 将数据从用于遍历的算法中分离出来
设计:迭代器模式
- 这是一种基于界面的设计模式。无论您想要迭代哪个对象,都将提供一个方法来从该对象返回迭代器的实例。
- 在获取迭代器实例的方式上遵循基于工厂的方法模式。
- 每个迭代器都是以独立于其他迭代器的方式开发的。
- 迭代器也会快速失败。快速失败意味着迭代器不能在不抛出错误的情况下修改底层对象。
- 列表界面扩展了收集界面。
- 列表接口包含一个工厂方法迭代器()。这个迭代器工厂方法返回迭代器接口的一个实例。
- 在列表及其实现的情况下,底层实例是列表迭代器。
- 列表迭代器是迭代器接口的实现,它理解如何在集合应用编程接口中迭代各种列表对象。它声明组合中对象的接口。
迭代器有如下陷阱:
- 你不能访问任何类型的索引。如果你想得到某个位置的元素,没有迭代就没有办法。在集合和映射的情况下,没有方法在某个索引位置抓取元素
- 单向:它只在正向迭代对象。
- 尽管迭代器是循环遍历任何类型对象的最有效方法。但是在某些情况下,它可能比使用索引并循环遍历要慢。
示例:
Java 语言(一种计算机语言,尤用于创建网站)
// Java Program to Implement Behavioral>Iterator Pattern
// importing required package to
// implement Behavioral>Iterator Pattern
package com.demo.application;
// Importing required libraries
// Here Iterator Interface to
// use it to iterate over the elements
import java.util.Iterator;
// Class 1
// Car Class Implementing Iterable Interface so
// that we can implement the iterator method and
// add our own implementation
public class Car implements Iterable<String> {
private String[] cars;
private int index;
// Default Constructor
public Car() {
cars = new String[10];
index = 0;
}
// Method 1
// Adding method to add Cars
public void addCar(String car) {
if (index == cars.length) {
String[] largerCars = new String[cars.length + 5];
System.arraycopy(cars, 0, largerCars, 0, cars.length);
cars = largerCars;
largerCars = null;
}
cars[index] = car;
index++;
}
// Method 2
// Implementing the iterator method and
// adding your own implementation
@Override
public Iterator<String> iterator() {
Iterator<String> it = new Iterator<String>() {
private int currentIndex = 0;
// Method 3
// Finding whether during iteration if
// there is next element or not
@Override
public boolean hasNext() {
return currentIndex < cars.length && cars[currentIndex] != null;
}
// Method 4
// Going to grab each car element by one by one
// according to the index
@Override
public String next() {
return cars[currentIndex++];
}
// Method 5
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
return it;
}
// Method 6
// Main driver method
public static void main(String[] args) {
// Instantiating Car object
Car cars = new Car();
// Adding cars to the Array
cars.addCar("Dodge");
cars.addCar("Ferrari");
cars.addCar("Sedan");
// Creating an Iterator and pointing the cursor
// to the index just before the first element in cars
Iterator<String> carIterator = cars.iterator();
// Checking whether the next element is available or not
while (carIterator.hasNext()) {
System.out.println(carIterator.next());
}
}
}
结论:
- 迭代器是遍历对象的有效方法。
- 对客户端隐藏算法,以便客户端的简单性包含在您为其创建迭代器的容器中的算法中
- 帮助我们简化客户。
- 帮助我们利用 for each 语法,这无疑简化了在 for each 循环中迭代该对象的过程。
版权属于:月萌API www.moonapi.com,转载请注明出处