Iteratorパターンを使ってみた

っということで、デザインパターンのお勉強の第一回目はIteratorパターン。

その名の通り、ListなどCollectionが実装しているIteratorって便利じゃね?
だったらObjectに実装してみようぜ!って事。
なんというか普通に何か作ってれば自然に思いつくようなデザインパターン
まぁ、最初はこんなものでしょ。

以前、業務改善用に作成したアプリケーションを作ったので、それを思い出しながらIteratorを使って改造してみた。

■内容
・「[XXX-YYY]」を渡したら、「XXX」〜「YYY」を順番に呼び出してくれます。
・XXX

public class StudyIterator implements Iterator<String> {

    private int index = 0;

    private List<String> list;

    public StudyIterator(String str) {
        Pattern p = Pattern.compile("\[([0-9]++)[-]([0-9]++)\]");
        Matcher m = p.matcher(str);
        if (m.find()) {
            String fstr = m.group(1);
            String lstr = m.group(2);

            list = createList(createformat(fstr, lstr), fstr, lstr);
        } else {
            list = new ArrayList<String>();
            list.add(str);
        }
    }

    private String createformat(String str1, String str2) {
        int length;
        if (str1.length() > str2.length()) {
            length = str1.length();
        } else {
            length = str2.length();
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append("0");
        }

        return sb.toString();
    }

    private List<String> createList(String format, String str1, String str2) {

        int bi;
        int si;

        List<String> list = new ArrayList<String>();

        if (Integer.parseInt(str1) > Integer.parseInt(str2)) {
            bi = Integer.parseInt(str1);
            si = Integer.parseInt(str2);
        } else {
            si = Integer.parseInt(str1);
            bi = Integer.parseInt(str2);
        }
        DecimalFormat df = new DecimalFormat(format);

        for (int i = si; i <= bi; i++) {
            list.add(df.format(i));
        }
        return list;
    }

    @Override
    public boolean hasNext() {
        return index < list.size();
    }

    @Override
    public String next() {
        String str = list.get(index);
        index++;
        return str;
    }

    @Override
    public void remove() {
        list.remove(index);
        index--;
    }
}

public class Test {
    public static void main(String[] args) {
        String[] strs = new String[]{
                "[005-013]",
                "[11-020]",
                "[0020-23]]",
                "[aaa-bb]",
                "[test]"
        };
        for (String str:strs) {
            System.out.println("start : "  + str);
            loop(str);
        }
    }

    public static void loop(String str) {
        for (Iterator<String> itr= new StudyIterator(str);itr.hasNext();) {
            System.out.print(itr.next() + ",");
        }
        System.out.println();
    }
}

しかし、やってみてから思ったけどStringだからかなりずれたような気がする。
Object内にクラスを持っていて、メソッドでiteratorを実装したクラス返す。
というのがデザインパターンであって、下のはただIteratorを実装しただけですな。
あえて言うなら、実際にはできる訳ないけどStringを拡張してiteratorメソッドを作成。
そこで返すのが↑のクラスとかだとこのデザインパターンになるのかな?

っというかソースが読みにくいw
明日にでもライブラリ入れて読みやすくしよー!
はてな記法で出来ました。(ソースコードを色付けして記述する(シンタックス・ハイライト)