什么设计模式可以避免重载功能

时间:2016-03-09 14:33:47

标签: java design-patterns

我目前正在编写一个将String转换为int的程序 我有自己的规则示例:(" 37dsqff" = 37)(" 50 km / h" = 50) 问题是字符串可以是任何种类(StringBuffer,Vector,InputStream ......),我不能控制它。

到目前为止,我为每个人制作了1个parseInt()函数。 它看起来像这样:

public class Tools {


    public static int parseInt(StringBuffer s)
    {
        ...
        return n;
    }
    public static int parseInt(Vector<Character> v)
    {
        ...
        return n;
    }
    ....
}

我注意到每个函数都有太多的相似之处,我想使用一个设计模式来使它更好,只有一个parseInt函数

我认为访客,模板方法,但我不知道这里最好的是什么。

1 个答案:

答案 0 :(得分:1)

最简单(也是最简单)的技术是找到通用接口,看看你是否可以在更一般的层面上实现你的功能。

类似的东西:

public static class Tools {

    // CharSequence covers both String and StringBuilder.
    public static int parseInt(CharSequence s) {
        return 4;
    }

    // Use Iterable instead of Vector (Vector implements List).
    public static int parseInt(Iterable<Character> v) {
        return 6;
    }

}

一旦完成,您可以通过编写将一个结构转换为另一个结构的适配器来进一步完善它。这将使Iterable<Character>中出现CharSequence

// Make an Iterable<Character> from a CharSequence.
public static class CharWalker implements Iterable<Character> {

    final CharSequence s;

    public CharWalker(CharSequence s) {
        this.s = s;
    }

    @Override
    public Iterator<Character> iterator() {
        return new Iterator<Character>() {
            int i = 0;

            @Override
            public boolean hasNext() {
                return i < s.length();
            }

            @Override
            public Character next() {
                return s.charAt(i++);
            }

        };
    }

}

所以现在我们可以将两者合二为一:

public static class Tools {

    // CharSequence covers both String and StringBuilder.
    public static int parseInt(CharSequence s) {
        // Forward to the Iterable version below.
        return parseInt(new CharWalker(s));
    }

    // Use Iterable instead of Vector (Vector implements List).
    public static int parseInt(Iterable<Character> v) {
        return 6;
    }

}