




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)迭代器模式
這期內(nèi)容當(dāng)中在下將會(huì)給大家?guī)?lái)有關(guān)Android中怎么實(shí)現(xiàn)迭代器模式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。一、介紹迭代器模式(IteratorPattern)又稱為游標(biāo)(Cursor)模式,是行為型設(shè)計(jì)模式之一。迭代器模式算是一個(gè)比較古老的設(shè)計(jì)模式,其源于對(duì)容器的訪問(wèn),比如Java中的List、Map、數(shù)組等,我們知道對(duì)容器對(duì)象的訪問(wèn)必然會(huì)涉及遍歷算法,我們可以將遍歷的方法封裝在容器中,或者不提供遍歷方法。如果我們將遍歷的方法封裝到容器中,那么對(duì)于容器類來(lái)說(shuō)就承擔(dān)了過(guò)多的功能,容器類不僅要維護(hù)自身內(nèi)部的數(shù)據(jù)元素而且還要對(duì)外提供遍歷的接口方法,因?yàn)楸闅v狀態(tài)的存儲(chǔ)問(wèn)題還不能對(duì)同一個(gè)容器同時(shí)進(jìn)行多個(gè)遍歷操作,如果我們不提供遍歷方法而讓使用者自己去實(shí)現(xiàn),又會(huì)讓容器的內(nèi)部細(xì)節(jié)暴露無(wú)遺,正因于此,迭代模式應(yīng)運(yùn)而生,在客戶訪問(wèn)類與容器體之間插入了一個(gè)第三者——迭代器,很好地解決了上面所述的弊端。二、定義提供一種方法順序訪問(wèn)一個(gè)容器對(duì)象中的各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示。三、使用場(chǎng)景遍歷一個(gè)容器對(duì)象。四、迭代器模式的UML類圖UML類圖:通用模式代碼:迭代器接口:public
interface
Iterator<T>
{
/**
*
是否還有下一個(gè)元素
*
@return
true表示有,false表示沒有
**/
boolean
hasNext();
/**
*
返回當(dāng)前位置的元素并將位置移至下一位
**/
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>
{
/**
*
添加一個(gè)元素
**/
void
add(T
obj);
/**
*
移除一個(gè)元素
**/
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:迭代器接口,迭代器接口負(fù)責(zé)定義、訪問(wèn)和遍歷元素的接口。ConcreteIterator:具體迭代器類,具體迭代器類的目的主要是實(shí)現(xiàn)迭代器接口,并記錄遍歷的當(dāng)前位置。Aggregate:容器接口,容器接口負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口。ConcreteAggregate:具體容器類,具體迭代器角色與該容器相關(guān)聯(lián)。Client:客戶類。五、簡(jiǎn)單實(shí)現(xiàn)小民和小輝分別在公司的兩個(gè)事業(yè)部,某天老板安排任務(wù)讓他們倆統(tǒng)計(jì)一下各自部門的員工數(shù)據(jù),這很好辦嘛,建一個(gè)類用數(shù)據(jù)結(jié)構(gòu)把所有員工數(shù)據(jù)存進(jìn)去即可,老板要看的時(shí)候給他用for循環(huán)實(shí)現(xiàn),還是比較容易的,下面就先為員工創(chuàng)建一個(gè)實(shí)體類:?jiǎn)T工實(shí)體類: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;
}
//
簡(jiǎn)化代碼,省略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,
"女",
"測(cè)試"));
list.add(new
Employee("小方",
18,
"女",
"測(cè)試"));
list.add(new
Employee("可兒",
21,
"女",
"設(shè)計(jì)"));
list.add(new
Employee("朗情",
19,
"女",
"設(shè)計(jì)"));
//吐槽一下,為什么就小民一個(gè)男的,小輝部門全男的。
}
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)部實(shí)現(xiàn)是兩種方式,小民的人員信息容器的內(nèi)部實(shí)質(zhì)是使用的一個(gè)List類存儲(chǔ)人員信息,而小輝的實(shí)質(zhì)上使用的是一個(gè)數(shù)組,如果老板要查看人員信息就必須遍歷兩個(gè)容器: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='測(cè)試'}
Employee{name='小方',
age=18,
sex=女,
position='測(cè)試'}
Employee{name='可兒',
age=21,
sex=女,
position='設(shè)計(jì)'}
Employee{name='朗情',
age=19,
sex=女,
position='設(shè)計(jì)'}這樣看似也沒有問(wèn)題,但是如果有多個(gè)部門,每個(gè)部門有各自的實(shí)現(xiàn),那么我們就要在Boss類中增加一遍遍歷邏輯,這樣Boss類的功能會(huì)越來(lái)越多,同時(shí)暴露了內(nèi)部細(xì)節(jié)。那么我們需要定義一個(gè)迭代器接口:public
interface
Iterator
{
/**
*
是否還有下一個(gè)元素
*
*
@return
true表示有,false表示沒有
*/
boolean
hasNext();
/**
*
返回當(dāng)前元素,并將位置移至下一位
*/
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
{
/**
*
返回一個(gè)迭代器對(duì)象
*
*
@return
迭代器對(duì)象
*/
Iterator
iterator();
}修改一下之前的兩個(gè)容器類: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,
"女",
"測(cè)試"));
list.add(new
Employee("小方",
18,
"女",
"測(cè)試"));
list.add(new
Employee("可兒",
21,
"女",
"設(shè)計(jì)"));
list.add(new
Employee("朗情",
19,
"女",
"設(shè)計(jì)"));
}
public
List<Employee>
getEmployees(){
return
list;
}
@Override
publi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)設(shè)計(jì)師能力測(cè)評(píng)試題及答案
- 南昌音樂(lè)面試題及答案
- 護(hù)理骨干筆試題目及答案
- 光電工程師證書考試情境模擬試題及答案
- 檢驗(yàn)三基試題及答案完整
- 突破衛(wèi)生管理考試瓶頸的試題及答案
- 神經(jīng)疾病康復(fù)試題及答案
- 激光技術(shù)工程師證書考試試題及答案中的思維方式
- 考點(diǎn)突破練習(xí)公共營(yíng)養(yǎng)師試題及答案
- 激光設(shè)備的自主研發(fā)案例試題及答案
- 湖北省武漢市2025屆高中畢業(yè)生四月調(diào)研考試數(shù)學(xué)試卷及答案(武漢四調(diào))
- 2025-2030中國(guó)實(shí)驗(yàn)動(dòng)物行業(yè)市場(chǎng)深度調(diào)研及市場(chǎng)前瞻與投資戰(zhàn)略研究報(bào)告
- 湖南湘潭高新集團(tuán)有限公司招聘考試真題2024
- 2025春季學(xué)期國(guó)開電大本科《政府經(jīng)濟(jì)學(xué)》一平臺(tái)在線形考(形考任務(wù)1至4)試題及答案
- 2025至2030年中國(guó)臺(tái)式特定電磁波譜治療器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 正式戀愛協(xié)議書
- 2024年多媒體應(yīng)用設(shè)計(jì)師理論知識(shí)試題及答案
- 創(chuàng)建全國(guó)文明城市培訓(xùn)
- 2025年蘭州糧油集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- GB 21258-2024燃煤發(fā)電機(jī)組單位產(chǎn)品能源消耗限額
- DB34∕T 4010-2021 水利工程外觀質(zhì)量評(píng)定規(guī)程
評(píng)論
0/150
提交評(píng)論