版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應用開發(fā)技術(shù)】Android中怎么實現(xiàn)迭代器模式
這期內(nèi)容當中在下將會給大家?guī)碛嘘P(guān)Android中怎么實現(xiàn)迭代器模式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。一、介紹迭代器模式(IteratorPattern)又稱為游標(Cursor)模式,是行為型設(shè)計模式之一。迭代器模式算是一個比較古老的設(shè)計模式,其源于對容器的訪問,比如Java中的List、Map、數(shù)組等,我們知道對容器對象的訪問必然會涉及遍歷算法,我們可以將遍歷的方法封裝在容器中,或者不提供遍歷方法。如果我們將遍歷的方法封裝到容器中,那么對于容器類來說就承擔了過多的功能,容器類不僅要維護自身內(nèi)部的數(shù)據(jù)元素而且還要對外提供遍歷的接口方法,因為遍歷狀態(tài)的存儲問題還不能對同一個容器同時進行多個遍歷操作,如果我們不提供遍歷方法而讓使用者自己去實現(xiàn),又會讓容器的內(nèi)部細節(jié)暴露無遺,正因于此,迭代模式應運而生,在客戶訪問類與容器體之間插入了一個第三者——迭代器,很好地解決了上面所述的弊端。二、定義提供一種方法順序訪問一個容器對象中的各個元素,而又不需要暴露該對象的內(nèi)部表示。三、使用場景遍歷一個容器對象。四、迭代器模式的UML類圖UML類圖:通用模式代碼:迭代器接口:public
interface
Iterator<T>
{
/**
*
是否還有下一個元素
*
@return
true表示有,false表示沒有
**/
boolean
hasNext();
/**
*
返回當前位置的元素并將位置移至下一位
**/
T
next();
}具體迭代器類:public
class
ConcreteIterator<T>
implements
Iterator<T>{
private
List<T>
list;
private
int
cursor
=
0;
public
ConcreteIterator(List<T>
list)
{
this.list
=
list;
}
@Override
public
boolean
hasNext()
{
return
cursor
!=
list.size();
}
@Override
public
T
next()
{
T
obj
=
null;
if
(this.hasNext())
{
obj
=
this.list.get(cursor++);
}
return
obj;
}
}容器接口:public
interface
Aggregation<T>
{
/**
*
添加一個元素
**/
void
add(T
obj);
/**
*
移除一個元素
**/
void
remove(T
obj);
/**
*
獲取容器的迭代器
**/
Iterator<T>
iterator();
}具體容器類:public
class
ConcreteAggregation<T>
implements
Aggregation<T>{
private
List<T>
list
=
new
ArrayList<>();
@Override
public
void
add(T
obj)
{
list.add(obj);
}
@Override
public
void
remove(T
obj)
{
list.remove(obj);
}
@Override
public
Iterator<T>
iterator()
{
return
new
ConcreteIterator<>(list);
}
}客戶類:public
class
Client
{
public
static
void
main(String
args[])
{
Aggregation<String>
a
=
new
ConcreteAggregation<>();
a.add("a");
a.add("b");
a.add("c");
Iterator<String>
iterator
=
a.iterator();
while
(iterator.hasNext())
{
System.out.print(iterator.next());
}
}
}角色介紹:Iterator:迭代器接口,迭代器接口負責定義、訪問和遍歷元素的接口。ConcreteIterator:具體迭代器類,具體迭代器類的目的主要是實現(xiàn)迭代器接口,并記錄遍歷的當前位置。Aggregate:容器接口,容器接口負責提供創(chuàng)建具體迭代器角色的接口。ConcreteAggregate:具體容器類,具體迭代器角色與該容器相關(guān)聯(lián)。Client:客戶類。五、簡單實現(xiàn)小民和小輝分別在公司的兩個事業(yè)部,某天老板安排任務讓他們倆統(tǒng)計一下各自部門的員工數(shù)據(jù),這很好辦嘛,建一個類用數(shù)據(jù)結(jié)構(gòu)把所有員工數(shù)據(jù)存進去即可,老板要看的時候給他用for循環(huán)實現(xiàn),還是比較容易的,下面就先為員工創(chuàng)建一個實體類:員工實體類:public
class
Employee
{
private
String
name;//
姓名
private
int
age;//
年齡
private
String
sex;//
性別
private
String
position;//
職位
public
Employee(String
name,
int
age,
String
sex,
String
position)
{
super();
=
name;
this.age
=
age;
this.sex
=
sex;
this.position
=
position;
}
//
簡化代碼,省略setter和getter方法
@Override
public
String
toString()
{
return
"Employee{"
+
"name='"
+
name
+
'\''
+
",
age="
+
age
+
",
sex="
+
sex
+
",
position='"
+
position
+
'\''
+
"}";
}
}小民部門:public
class
CompanyMin
{
private
List<Employee>
list
=
new
ArrayList<>();
public
CompanyMin(){
list.add(new
Employee("小民",
26,
"男",
"程序猿"));
list.add(new
Employee("小蕓",
22,
"女",
"測試"));
list.add(new
Employee("小方",
18,
"女",
"測試"));
list.add(new
Employee("可兒",
21,
"女",
"設(shè)計"));
list.add(new
Employee("朗情",
19,
"女",
"設(shè)計"));
//吐槽一下,為什么就小民一個男的,小輝部門全男的。
}
public
List<Employee>
getEmployees(){
return
list;
}
}小輝部門:public
class
CompanyHui
{
private
Employee[]
array
=
new
Employee[3];
public
CompanyHui(){
array[0]
=
new
Employee("輝哥",
28,
"男",
"程序猿");
array[1]
=
new
Employee("小紅",
23,
"男",
"程序猿");
array[2]
=
new
Employee("小輝",
25,
"男",
"程序猿");
}
public
Employee[]
getEmployees(){
return
array;
}
}可見小民和小輝的內(nèi)部實現(xiàn)是兩種方式,小民的人員信息容器的內(nèi)部實質(zhì)是使用的一個List類存儲人員信息,而小輝的實質(zhì)上使用的是一個數(shù)組,如果老板要查看人員信息就必須遍歷兩個容器:Boss查看:public
class
Boss
{
public
static
void
main(String[]
args)
{
CompanyHui
hui
=
new
CompanyHui();
Employee[]
huiList
=
hui.getEmployees();
for(int
i
=
0;
i
<
huiList.length;
i++){
System.out.println(huiList[i]);
}
CompanyMin
min
=
new
CompanyMin();
List
minList
=
min.getEmployees();
for(int
i
=
0;
i
<
minList.size();
i++){
System.out.println(minList.get(i).toString());
}
}
}結(jié)果:Employee{name='輝哥',
age=28,
sex=男,
position='程序猿'}
Employee{name='小紅',
age=23,
sex=男,
position='程序猿'}
Employee{name='小輝',
age=25,
sex=男,
position='程序猿'}
Employee{name='小民',
age=26,
sex=男,
position='程序猿'}
Employee{name='小蕓',
age=22,
sex=女,
position='測試'}
Employee{name='小方',
age=18,
sex=女,
position='測試'}
Employee{name='可兒',
age=21,
sex=女,
position='設(shè)計'}
Employee{name='朗情',
age=19,
sex=女,
position='設(shè)計'}這樣看似也沒有問題,但是如果有多個部門,每個部門有各自的實現(xiàn),那么我們就要在Boss類中增加一遍遍歷邏輯,這樣Boss類的功能會越來越多,同時暴露了內(nèi)部細節(jié)。那么我們需要定義一個迭代器接口:public
interface
Iterator
{
/**
*
是否還有下一個元素
*
*
@return
true表示有,false表示沒有
*/
boolean
hasNext();
/**
*
返回當前元素,并將位置移至下一位
*/
Object
next();
}小民的迭代器:public
class
MinIterator
implements
Iterator{
private
List<Employee>
list;
private
int
position;
public
MinIterator(List<Employee>
list){
this.list
=
list;
}
@Override
public
boolean
hasNext()
{
return
!(position
>
list.size()
-
1
||
list.get(position)
==
null);
}
@Override
public
Object
next()
{
Employee
e
=
list.get(position);
position++;
return
e;
}
}小輝的迭代器:public
class
HuiIterator
implements
Iterator{
private
Employee[]
array;
private
int
position;
public
HuiIterator(Employee[]
array){
this.array
=
array;
}
@Override
public
boolean
hasNext()
{
return
!(position
>
array.length
-
1
||
array[position]
==
null);
}
@Override
public
Object
next()
{
Employee
e
=
array[position];
position++;
return
e;
}
}定義容器類的接口:public
interface
Company
{
/**
*
返回一個迭代器對象
*
*
@return
迭代器對象
*/
Iterator
iterator();
}修改一下之前的兩個容器類:public
class
CompanyHui
implements
Company{
private
Employee[]
array
=
new
Employee[3];
public
CompanyHui(){
array[0]
=
new
Employee("輝哥",
28,
"男",
"程序猿");
array[1]
=
new
Employee("小紅",
23,
"男",
"程序猿");
array[2]
=
new
Employee("小輝",
25,
"男",
"程序猿");
}
public
Employee[]
getEmployees(){
return
array;
}
@Override
public
Iterator
iterator()
{
return
new
HuiIterator(array);
}
}public
class
CompanyMin
implements
Company{
private
List<Employee>
list
=
new
ArrayList<>();
public
CompanyMin(){
list.add(new
Employee("小民",
26,
"男",
"程序猿"));
list.add(new
Employee("小蕓",
22,
"女",
"測試"));
list.add(new
Employee("小方",
18,
"女",
"測試"));
list.add(new
Employee("可兒",
21,
"女",
"設(shè)計"));
list.add(new
Employee("朗情",
19,
"女",
"設(shè)計"));
}
public
List<Employee>
getEmployees(){
return
list;
}
@Override
publi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國香薰蠟燭市場運行動態(tài)及前景趨勢預測報告
- 2025-2030年中國飛輪儲能行業(yè)市場運行狀況及未來發(fā)展趨勢分析報告
- 2025-2030年中國輪椅行業(yè)市場未來發(fā)展趨勢及前景調(diào)研分析報告
- 二零二五版北碚集資房交易合同(含房屋租賃權(quán)確認)3篇
- 單板加工企業(yè)經(jīng)營管理與決策能力考核試卷
- 光纖預制棒制備工藝考核試卷
- 2025年度消費者維權(quán)賠償與電子商務法實施合同
- 體育用品店社區(qū)服務功能考核試卷
- 印刷行業(yè)創(chuàng)新技術(shù)應用案例考核試卷
- 供銷合同(完整版)
- 二零二五年企業(yè)存單質(zhì)押擔保貸款合同樣本3篇
- 鍋爐安裝、改造、維修質(zhì)量保證手冊
- 油氣行業(yè)人才需求預測-洞察分析
- (2024)河南省公務員考試《行測》真題及答案解析
- 1000只肉羊養(yǎng)殖基地建設(shè)項目可行性研究報告
- 《勞保用品安全培訓》課件
- 2024版房屋市政工程生產(chǎn)安全重大事故隱患判定標準內(nèi)容解讀
- 2024院感年終總結(jié)報告
- 高一化學《活潑的金屬單質(zhì)-鈉》分層練習含答案解析
- 04S206自動噴水與水噴霧滅火設(shè)施安裝圖集
評論
0/150
提交評論