1. 程式人生 > >設計模式迭代器模式(IteratorPattern)

設計模式迭代器模式(IteratorPattern)

核心模組:迭代器角色(定義訪問和遍歷元素的介面),具體迭代器角色,容器角色,具體容器角色 所有程式碼請訪問:[email protected]:289804201/PatternLearn.git 使用場景:外部物件訪問內部聚合物件; 優點:將儲存資料和遍歷資料分開,符合單一職責原則;

缺點:新聚合類,就要增加新的迭代器類;增加系統複雜性;

/**
 * Created by tory on 2017/12/29.
 * 迭代器模式
 */
public class IteratorPattern {
    public static void main(String[] args) {
        //客戶端要柔和業務員A和B的程式碼,兩個聚合類;
        TVChannelMenu tvChannelMenu = new TVChannelMenu();
        TVMovieMenu tvMovieMenu = new TVMovieMenu();
        printMenu(tvChannelMenu.createIterator());
        printMenu(tvMovieMenu.createIterator());
    }

    //如果不使用迭代器模式這裡要寫兩個迴圈遍歷
    public static void printMenu(Iterator<DataItem> iterator) {
        while (iterator.hasNext()) {
            DataItem item = iterator.next();
            System.out.println("-->" + item.id + " " + item.name + " " + item.des);
        }
    }
}

//資料結構
class DataItem {
    int id;
    String name;
    String des;

    public DataItem(int id, String name, String des) {
        this.id = id;
        this.name = name;
        this.des = des;
    }
}

//Iterator 迭代器角色
interface Iterator<T> {
    boolean hasNext();

    T next();
}

//Concrete Iterator 具體迭代器角色
class TvChannelIterator implements Iterator<DataItem> {
    List<DataItem> list;
    int position = 0;

    public TvChannelIterator(List<DataItem> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return (position < list.size() - 1);
    }

    @Override
    public DataItem next() {
        return list.get(position++);
    }
}

//Container 容器角色
interface Container {
    void add(DataItem item);

    Iterator createIterator();
}

//ConcreteContainer具體容器角色
class TVChannelMenu implements Container {
    //業務員A提供的資料程式碼
    List<DataItem> tvchannels = new ArrayList<>();

    public TVChannelMenu() {
        tvchannels.add(new DataItem(0, "還珠格格", "瓊瑤小說改變"));
        tvchannels.add(new DataItem(1, "新三國", "媲美冰與火之歌的史詩電視劇"));
        tvchannels.add(new DataItem(2, "抗日神劇", "呵呵"));
    }

    @Override
    public void add(DataItem item) {
        if (null == item) {
            return;
        }
        tvchannels.add(item);
    }
    @Override
    public Iterator createIterator() {
        Iterator iterator = new TvChannelIterator(tvchannels);
        return iterator;
    }
}

//Concrete Iterator 具體迭代器角色
class TVMovieIterator implements Iterator<DataItem> {
    DataItem[] datas;
    int MAX_LEN = 5;
    int position = 0;

    public TVMovieIterator(DataItem[] datas) {
        this.datas = datas;
    }

    @Override
    public boolean hasNext() {
        return position < MAX_LEN;
    }

    @Override
    public DataItem next() {
        return datas[position++];
    }
}

//ConcreteContainer具體容器角色
class TVMovieMenu implements Container{
    //業務員B提供的資料程式碼
    DataItem[] movies = new DataItem[5];

    public TVMovieMenu() {
        movies[0] = new DataItem(1, "肖生克的救贖", "一部人性解救的電影");
        movies[1] = new DataItem(2, "哈利波特1", "講述了一個奇幻魔法世界");
        movies[2] = new DataItem(3, "變形金剛", "人與外星機器人並肩戰鬥");
        movies[3] = new DataItem(4, "哈利波特1", "講述了一個奇幻魔法世界");
        movies[4] = new DataItem(5, "變形金剛", "人與外星機器人並肩戰鬥");
    }

    @Override
    public void add(DataItem item) {

    }
    @Override
    public Iterator createIterator() {
        TVMovieIterator iterator = new TVMovieIterator(movies);
        return iterator;
    }
}

內容列印 Hello World! -->0 還珠格格 瓊瑤小說改變 -->1 新三國 媲美冰與火之歌的史詩電視劇 -->1 肖生克的救贖 一部人性解救的電影 -->2 哈利波特1 講述了一個奇幻魔法世界 -->3 變形金剛 人與外星機器人並肩戰鬥 -->4 哈利波特1 講述了一個奇幻魔法世界 -->5 變形金剛 人與外星機器人並肩戰鬥