【移動應用開發(fā)技術(shù)】Android中怎么實現(xiàn)迭代器模式_第1頁
【移動應用開發(fā)技術(shù)】Android中怎么實現(xiàn)迭代器模式_第2頁
【移動應用開發(fā)技術(shù)】Android中怎么實現(xiàn)迭代器模式_第3頁
【移動應用開發(fā)技術(shù)】Android中怎么實現(xiàn)迭代器模式_第4頁
【移動應用開發(fā)技術(shù)】Android中怎么實現(xiàn)迭代器模式_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論