設計模式迭代器模式(IteratorPattern)
阿新 • • 發佈:2018-12-31
核心模組:迭代器角色(定義訪問和遍歷元素的介面),具體迭代器角色,容器角色,具體容器角色
所有程式碼請訪問:[email protected]:289804201/PatternLearn.git
使用場景:外部物件訪問內部聚合物件;
優點:將儲存資料和遍歷資料分開,符合單一職責原則;
內容列印 Hello World! -->0 還珠格格 瓊瑤小說改變 -->1 新三國 媲美冰與火之歌的史詩電視劇 -->1 肖生克的救贖 一部人性解救的電影 -->2 哈利波特1 講述了一個奇幻魔法世界 -->3 變形金剛 人與外星機器人並肩戰鬥 -->4 哈利波特1 講述了一個奇幻魔法世界 -->5 變形金剛 人與外星機器人並肩戰鬥
缺點:新聚合類,就要增加新的迭代器類;增加系統複雜性;
/** * 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 變形金剛 人與外星機器人並肩戰鬥