Unity 話大 設計模式之迭代器模式

2021-09-29 19:09:49 字數 3076 閱讀 2722

前言:筆者在最開始寫程式的時候經常會遇到一種情況,例如更改乙個字段、或者新增一種小功能,就要把原來寫過的東西幾乎廢棄掉,或者更改大量以前寫過的**。又或者自己寫的東西時間久了再去回顧,完全找不到到時為什麼這麼寫的頭緒,如果遇到了bug更是無法快速定位在**小範圍出現的問題。如果你也經常遇到這種問題,就說明你現階段非常需要學習下設計模式了

在網上經常說的設計模式有23種,也有一些更多的設計模式,無非也是從這些設計模式中變種而來。如果讓筆者來形容什麼是設計模式,我認為設計模式是:一種思想,一種模式,一種套路,一種解決問題的高效策略

在日常開中我們一定用到過foreach。 這種遍歷方式可以在 array ilist idictionary等資料結構中通用。其實他的實現其實就是用到的迭代器模式,今天筆者就跟大家說一說迭代器的實現方式。

迭代器模式(iteratorpattern)提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。

下面筆者逐步完成迭代器模式的構建
首先我們先建立乙個簡單的集合

public class group

}public object this[int index]

set }}

為了讓多種集合都能使用同一種遍歷方式,我們再建立乙個通用迭代器

public class iterator

private int index = -1;

public object current

}public bool movenext()

public void reset()

}

然後我們把迭代器鑲嵌到這個集合中

public class group

}public object this[int index]

set

}public iterator getiterator()

}

呼叫~這樣我們乙個簡單的迭代器就完成了
void start()

是不是很簡單呢?接下來我們開始重構

iterator中我們不能確定這個遍歷的集合是列表、字典還是陣列,但是我們可以確定他們都含有currentmovenextreset三種元素所以我們將這三種元素進行抽象,與原來的迭代器類進行剝離

public inte***ce iteratorbase

bool movenext();

void reset();

}

原迭代器類繼承介面iteratorbase

public class iterator: iteratorbase

private int index = -1;

public object current

}public bool movenext()

public void reset()

}

既然原迭代器類繼承介面iteratorbase,那麼以可以根據這個介面所規定的結構,讓細節的實現統統轉移到子類中實現,也就是說,我們可以定義出多種滿足不同迭代需求的迭代類,但是呼叫的函式都是一樣的,因為都繼承自iteratorbase。根據黎克特制替換原則我們知道,對應的group中所返回的public iterator getiterator()完全可以用介面iteratorbase代替

public class group

}public object this[int index]

set

}public iteratorbase getiterator()

}

最後,為了區分什麼樣子的集合可以使用通用迭代模式,我們做乙個獲得迭代器的介面,只要繼承這個介面的集合,就都可以使用通用迭代模式了

public inte***ce ienumerable

public class group: ienumerable

}public object this[int index]

set

}public iteratorbase getiterator()

}

經過剝離和抽象,我們的迭代器模式就完成了。迭代器就是把原有需要遍歷的結構進行一次包裝,把包裝後的結構再統一進行遍歷

其實在c# 中自帶的迭代器要比我們這個更強大,他最大的特點就是按需逐步查詢unity 之資料集合解析中的最後ienumerable補充部分有例子說明,這裡就不在熬述。

所以說微軟有更好的,就用微軟的,這種無用的輪子我們還是不要浪費時間再造了,了解下原理就好。

Unity 話大 設計模式之抽象工廠

前言 筆者在最開始寫程式的時候經常會遇到一種情況,例如更改乙個字段 或者新增一種小功能,就要把原來寫過的東西幾乎廢棄掉,或者更改大量以前寫過的 又或者自己寫的東西時間久了再去回顧,完全找不到到時為什麼這麼寫的頭緒,如果遇到了bug更是無法快速定位在 小範圍出現的問題。如果你也經常遇到這種問題,就說明...

Unity 話大 設計模式之工廠方法

前言 筆者在最開始寫程式的時候經常會遇到一種情況,例如更改乙個字段 或者新增一種小功能,就要把原來寫過的東西幾乎廢棄掉,或者更改大量以前寫過的 又或者自己寫的東西時間久了再去回顧,完全找不到到時為什麼這麼寫的頭緒,如果遇到了bug更是無法快速定位在 小範圍出現的問題。如果你也經常遇到這種問題,就說明...

設計模式之迭代器模式

概念 提供一種方法順序訪問乙個聚合物件中各個元素,而又不需暴露該物件的內部表示。main 客戶 iproject,產品介面 cproject,產品類 iiterator,迭代器介面 iprojectiterator,產品迭代器介面 cprojectiterator,產品迭代器實現類 說明 cproj...