二十三種設(shè)計(jì)模式分類

設(shè)計(jì)模式三大分類.jpg
一、概述
迭代器(Iterator)模式的定義:提供一個(gè)對(duì)象來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù),而不暴露聚合對(duì)象的內(nèi)部表示。
意圖:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又無(wú)須暴露該對(duì)象的內(nèi)部表示。
主要解決:不同的方式來(lái)遍歷整個(gè)集合對(duì)象,主要用于容器對(duì)象。
優(yōu)點(diǎn)
迭代器模式是一種對(duì)象行為型模式,其主要優(yōu)點(diǎn)如下。
- 訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)須暴露它的內(nèi)部表示。
- 遍歷任務(wù)交由迭代器完成,這簡(jiǎn)化了聚合類。
- 它支持以不同方式遍歷一個(gè)聚合,甚至可以自定義迭代器的子類以支持新的遍歷。
- 增加新的聚合類和迭代器類都很方便,無(wú)須修改原有代碼。
- 封裝性良好,為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口。
缺點(diǎn)
增加了類的個(gè)數(shù),這在一定程度上增加了系統(tǒng)的復(fù)雜性。
場(chǎng)景
1、訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)須暴露它的內(nèi)部表示。
2、需要為聚合對(duì)象提供多種遍歷方式。
3、為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口。
二、實(shí)現(xiàn)
1. 結(jié)構(gòu)圖
迭代器模式主要包含以下角色。
- 抽象聚合(
Aggregate)角色:定義存儲(chǔ)、添加、刪除聚合對(duì)象以及創(chuàng)建迭代器對(duì)象的接口。 - 具體聚合(
ConcreteAggregate)角色:實(shí)現(xiàn)抽象聚合類,返回一個(gè)具體迭代器的實(shí)例。 - 抽象迭代器(
Iterator)角色:定義訪問(wèn)和遍歷聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。 - 具體迭代器(
Concretelterator)角色:實(shí)現(xiàn)抽象迭代器接口中所定義的方法,完成對(duì)聚合對(duì)象的遍歷,記錄遍歷的當(dāng)前位置。

迭代器模式
PS:UML結(jié)構(gòu)圖可以參考,例子實(shí)現(xiàn)并不根據(jù)UML圖來(lái)完成,靈活實(shí)現(xiàn)即可;
2. 實(shí)現(xiàn)
- 迭代器接口
package cn.missbe.model.iterator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/29 上午9:35
* description:
**/
public interface SelfIterator<E>{
/**是否有下一個(gè)元素*/
boolean hasNext();
/**下一個(gè)元素*/
E next();
}
- 集合接口
package cn.missbe.model.iterator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/29 上午9:34
* description:
**/
public interface SelfCollection<T> {
/**添加元素*/
void add(T element);
/**集合大小*/
int size();
/**得到自己寫(xiě)的迭代器*/
SelfIterator<T> iterator();
}
- 具體集合容器
package cn.missbe.model.iterator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/29 上午9:34
* description: 自己模擬一個(gè)ArrayList容器
**/
public class SelfArrayList<T> implements SelfCollection<T>{
T[] elements;
int size;
public SelfArrayList(int n) {
elements = (T[])new Object[n];
size = 0;
}
public SelfArrayList(T[] elements) {
this.elements = elements;
size = 0;
}
@Override
public void add(T element) {
if (size == elements.length) {
T[] newElements = (T[]) new Object[elements.length * 2];
System.arraycopy(elements, 0, newElements, 0, elements.length);
elements = newElements;
}
elements[size] = element;
size++;
}
@Override
public int size() {
return size;
}
@Override
public SelfIterator<T> iterator() {
return new SelfArrayListIterator();
}
private class SelfArrayListIterator implements SelfIterator<T>{
private int curIndex = 0;
@Override
public boolean hasNext() {
return curIndex < size;
}
@Override
public T next() {
T o = elements[curIndex];
curIndex++;
return o;
}
}
}
- 主類,調(diào)用測(cè)試
package cn.missbe.model.iterator;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
* @author lyg 2020/4/29 上午9:33
* description:
* 迭代器模式:適用于容器遍歷
**/
public class Main {
public static void main(String[] args) {
SelfCollection<String> selfCollection = new SelfArrayList<>(10);
for (int i = 0; i < 10; i++) {
selfCollection.add(new String("ArrayList:" + i));
}
SelfIterator<String> iterator = selfCollection.iterator();
while (iterator.hasNext()) {
String e = iterator.next();
System.out.println(e);
}
}
}