Guava源碼分析——Strategy模式(Splitter)

策略模式(Strategy):
定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法的變化不會影響到使用算法的客戶。
在Guava的Splitter類中便用到了這種模式——
字符串的分割方式:
1、根據單個字符分割
public static Splitter on(char separator) {
    return on(CharMatcher.is(separator));
  }
實際調用的也是下面的第二種方式。
示例:Splitter.on(',').split("foo,,bar") ;
結果:["foo", "", "bar"]
 
2、根據CharMatcher分割
static Splitter on(final CharMatcher separatorMatcher)
返回的Splitter爲:
return new Splitter(new Strategy() {
      @Override public SplittingIterator iterator(
          Splitter splitter, final CharSequence toSplit) {
        return new SplittingIterator(splitter, toSplit) {
          @Override int separatorStart(int start) {
            return separatorMatcher.indexIn(toSplit, start);
          }
 
          @Override int separatorEnd(int separatorPosition) {
            return separatorPosition + 1;
          }
        };
      }
    });
示例:Splitter.on(CharMatcher.anyOf(";,")).split("foo,;bar,quux"); 
結果:["foo", "", "bar", "quux"]
 
3、根據字符串分割
static Splitter on(final String separator)
返回的Splitter爲:
return new Splitter(new Strategy() {
      @Override public SplittingIterator iterator(
          Splitter splitter, CharSequence toSplit) {
        return new SplittingIterator(splitter, toSplit) {
          @Override public int separatorStart(int start) {
            int delimeterLength = separator.length();
 
            positions:
            for (int p = start, last = toSplit.length() - delimeterLength;
                p <= last; p++) {
              for (int i = 0; i < delimeterLength; i++) {
                if (toSplit.charAt(i + p) != separator.charAt(i)) {
                  continue positions;
                }
              }
              return p;
            }
            return -1;
          }
 
          @Override public int separatorEnd(int separatorPosition) {
            return separatorPosition + separator.length();
          }
        };
      }
    });
示例:Splitter.on(", ").split("foo, bar,baz")
結果: ["foo", "bar,baz"]
 
4、根據匹配模式分割
static Splitter on(final Pattern separatorPattern)
返回的Splitter爲:
return new Splitter(new Strategy() {
      @Override public SplittingIterator iterator(
          final Splitter splitter, CharSequence toSplit) {
        final Matcher matcher = separatorPattern.matcher(toSplit);
        return new SplittingIterator(splitter, toSplit) {
          @Override public int separatorStart(int start) {
            return matcher.find(start) ? matcher.start() : -1;
          }
 
          @Override public int separatorEnd(int separatorPosition) {
            return matcher.end();
          }
        };
      }
    });
示例:Splitter.onPattern("\r?\n").split("a\r\nb\nc")
結果: ["a", "b", "c"]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章