




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)迭代器模式
這期內(nèi)容當(dāng)中在下將會(huì)給大家?guī)碛嘘P(guān)Android中怎么實(shí)現(xiàn)迭代器模式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。一、介紹迭代器模式(IteratorPattern)又稱為游標(biāo)(Cursor)模式,是行為型設(shè)計(jì)模式之一。迭代器模式算是一個(gè)比較古老的設(shè)計(jì)模式,其源于對容器的訪問,比如Java中的List、Map、數(shù)組等,我們知道對容器對象的訪問必然會(huì)涉及遍歷算法,我們可以將遍歷的方法封裝在容器中,或者不提供遍歷方法。如果我們將遍歷的方法封裝到容器中,那么對于容器類來說就承擔(dān)了過多的功能,容器類不僅要維護(hù)自身內(nèi)部的數(shù)據(jù)元素而且還要對外提供遍歷的接口方法,因?yàn)楸闅v狀態(tài)的存儲(chǔ)問題還不能對同一個(gè)容器同時(shí)進(jìn)行多個(gè)遍歷操作,如果我們不提供遍歷方法而讓使用者自己去實(shí)現(xiàn),又會(huì)讓容器的內(nèi)部細(xì)節(jié)暴露無遺,正因于此,迭代模式應(yīng)運(yùn)而生,在客戶訪問類與容器體之間插入了一個(gè)第三者——迭代器,很好地解決了上面所述的弊端。二、定義提供一種方法順序訪問一個(gè)容器對象中的各個(gè)元素,而又不需要暴露該對象的內(nèi)部表示。三、使用場景遍歷一個(gè)容器對象。四、迭代器模式的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é)定義、訪問和遍歷元素的接口。ConcreteIterator:具體迭代器類,具體迭代器類的目的主要是實(shí)現(xiàn)迭代器接口,并記錄遍歷的當(dāng)前位置。Aggregate:容器接口,容器接口負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口。ConcreteAggregate:具體容器類,具體迭代器角色與該容器相關(guān)聯(lián)。Client:客戶類。五、簡單實(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í)體類:員工實(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;
}
//
簡化代碼,省略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è)計(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='測試'}
Employee{name='小方',
age=18,
sex=女,
position='測試'}
Employee{name='可兒',
age=21,
sex=女,
position='設(shè)計(jì)'}
Employee{name='朗情',
age=19,
sex=女,
position='設(shè)計(jì)'}這樣看似也沒有問題,但是如果有多個(gè)部門,每個(gè)部門有各自的實(shí)現(xiàn),那么我們就要在Boss類中增加一遍遍歷邏輯,這樣Boss類的功能會(huì)越來越多,同時(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è)迭代器對象
*
*
@return
迭代器對象
*/
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,
"女",
"測試"));
list.add(new
Employee("小方",
18,
"女",
"測試"));
list.add(new
Employee("可兒",
21,
"女",
"設(shè)計(jì)"));
list.add(new
Employee("朗情",
19,
"女",
"設(shè)計(jì)"));
}
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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 3.2中國特色社會(huì)主義的創(chuàng)立、發(fā)展和完善 教學(xué)設(shè)計(jì) 統(tǒng)編版高中思想政治必修1中國特色社會(huì)主義
- 2025年廣州市稅務(wù)系統(tǒng)遴選面試真題附詳解含答案
- 鋁行業(yè)規(guī)范條件
- 聯(lián)系村工作分類指導(dǎo)實(shí)施方案范文(9篇)
- 敏感元件系統(tǒng)的高精度信號(hào)處理與分析技術(shù)
- 高溫作業(yè)防暑降溫用品配備
- 2025年瀘州古藺縣教育和體育局城區(qū)學(xué)校教師招聘考試筆試試題(含答案)
- 老爸的課件名稱
- 老年綜合評估技能操作課件
- 老年護(hù)理課程直播課件
- GB/T 18348-2022商品條碼條碼符號(hào)印制質(zhì)量的檢驗(yàn)
- GB/T 17619-1998機(jī)動(dòng)車電子電器組件的電磁輻射抗擾性限值和測量方法
- GB/T 10560-2017礦用焊接圓環(huán)鏈用鋼
- 2023年山東鐵路投資控股集團(tuán)有限公司校園招聘筆試題庫及答案解析
- 音標(biāo)版中考必考英語1600單詞
- 工程竣工初驗(yàn)報(bào)告表格
- 考勤及簽到表30天
- 靜脈輸液護(hù)理技術(shù)操作規(guī)范PPT
- 機(jī)械制造企業(yè)隱患排查清單(公司級(jí)、車間級(jí)、崗位級(jí))
- 的溶劑溶解度參數(shù)表
- 夏季高溫施工安全生產(chǎn)培訓(xùn)
評論
0/150
提交評論