首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Guava源码分析——Strategy形式(Splitter)

2013-09-30 
Guava源码分析——Strategy模式(Splitter)策略模式(Strategy):定义了一系列的算法,并将每一个算法封装起来,

Guava源码分析——Strategy模式(Splitter)
策略模式(Strategy):定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。Guava源码分析——Strategy形式(Splitter)在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"]

热点排行