迭代器模式
定義:提供一種方法順序的訪問聚合對(duì)象(用來存儲(chǔ)對(duì)象的容器可以是集合或者數(shù)組等)中的各個(gè)元素,但又不暴露其內(nèi)部的表示。
迭代器模式里的幾個(gè)角色:
●Iterator(抽象迭代器)訪問元素的接口牡拇,定義了遍歷元素的方法如:next()、hasNext()等潦嘶。
●ConcreteIterator(具體迭代器)實(shí)現(xiàn)Iterator接口實(shí)現(xiàn)遍歷聚合對(duì)象的方法贰锁。
●Aggregate(抽象聚合類)聲明一個(gè)createIterator()方法用于返回Iterator的實(shí)現(xiàn)對(duì)象。
●ConcreteAggregate(具體聚合類)實(shí)現(xiàn)createIterator()方法用于返回對(duì)應(yīng)的Iterator的實(shí)現(xiàn)對(duì)象固以。
實(shí)例講解:
本次采用公司報(bào)表的比喻來進(jìn)行講解墩虹。假設(shè)A公司有兩個(gè)子公司A-1和A-2每個(gè)子公司都有一個(gè)總經(jīng)理來管理公司,這兩位總經(jīng)理每個(gè)月都必須將各自公司的財(cái)務(wù)報(bào)表提交給總公司的財(cái)務(wù)部經(jīng)理然后由財(cái)務(wù)部經(jīng)理將各子公司的財(cái)務(wù)情況向董事長匯報(bào)(這里的報(bào)表格式是一定的但是存儲(chǔ)容器不一樣)憨琳。
代碼演示:
1.定義報(bào)表格式類
public class Item {
// 消費(fèi)名稱
private String name;
// 消費(fèi)金額
private int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Item{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
2.定義Iterator接口诫钓、
public interface Iterator {
boolean hasNext();
Item next();
}
3.這里假設(shè)A-1公司使用集合存儲(chǔ),A-2公司使用數(shù)組存儲(chǔ)篙螟,那么接下來定義兩子公司的Iterator具體實(shí)現(xiàn)類菌湃。
A-1
public class ChildOneIterator implements Iterator {
private ArrayList<Item> datas;
private int position=-1;
public ChildOneIterator(ArrayList<Item> datas) {
this.datas = datas;
}
@Override
public boolean hasNext() {
if(position+1>=datas.size()){
return false;
}
return true;
}
@Override
public Item next() {
position++;
if(hasNext()){
return datas.get(position);
}
return null;
}
}
A-2
public class ChildTwoIterator implements Iterator {
private Item[] datas;
private int position=-1;
public ChildTwoIterator(Item[] datas) {
this.datas = datas;
}
@Override
public boolean hasNext() {
if(position+1>=datas.length){
return false;
}
return true;
}
@Override
public Item next() {
position++;
if(hasNext()){
return datas[position];
}
return null;
}
}
4.定義Aggregate接口
public interface Aggregate {
Iterator createIterator();
}
3.定義A-1公司報(bào)表格式類(A-1公司采用集合存儲(chǔ),A-2公司采用數(shù)組存儲(chǔ))
A-1
public class ChildOne implements Aggregate{
private ArrayList<Item> datas;
public ChildOne() {
datas=new ArrayList<>();
datas.add(new Item("吃飯",1000));
datas.add(new Item("購買電腦",2000));
datas.add(new Item("購買飲水機(jī)",600));
datas.add(new Item("購買車票",500));
datas.add(new Item("購買硬盤",6000));
}
@Override
public Iterator createIterator() {
return new ChildOneIterator(datas);
}
}
A-2
public class ChildTwo implements Aggregate{
private Item[] datas={};
public ChildTwo() {
datas[1]=new Item("買水",500);
datas[2]=new Item("買花",200);
datas[3]=new Item("買涂料",600);
datas[4]=new Item("買辦公桌",2000);
datas[5]=new Item("買清潔工具",400);
}
@Override
public Iterator createIterator() {
return new ChildTwoIterator(datas);
}
}
定義財(cái)務(wù)主管類(這里我是用Android實(shí)現(xiàn)的)
public class Treasurer extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ChildOne one=new ChildOne();
ChildTwo two=new ChildTwo();
print(one.createIterator());
print(two.createIterator());
}
public void print(Iterator iterator){
while (iterator.hasNext()){
Item next = iterator.next();
Log.e("測(cè)試",next.toString());
}
}
}
結(jié)果展示