策略模式(Strategy)
定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。在Splitter中就主要使用了这种模式.
主要方法
基础写法为:
Splitter.on('.').split("a,b,c");
第一部分构建
Splitter.on( )
有很多Splitter.on()方法 每个参数不同,但他们都在其中构造了Spliter对象.
WIKI 这里就体现了策略模式,不同的Splitter.on()可以相互替换
例如:
public static Splitter on(final String separator) {
checkArgument(separator.length() != 0, "The separator may not be the empty string.");
if (separator.length() == 1) {
return Splitter.on(separator.charAt(0));
}
//返回Splitter对象
return new Splitter(
//构建Strategy接口,并进行实现
new Strategy() {
@Override
public SplittingIterator iterator(Splitter splitter, CharSequence toSplit) {
//接口方法的实现中又构建了SplittingIterator类
return new SplittingIterator(splitter, toSplit) {
@Override
public int separatorStart(int start) {
int separatorLength = separator.length();
positions:
for (int p = start, last = toSplit.length() - separatorLength; p <= last; p++) {
for (int i = 0; i < separatorLength; 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构造方法
//默认构造方法,传入的基本参数是Strategy接口
private Splitter(Strategy strategy) {
this(strategy, false, CharMatcher.none(), Integer.MAX_VALUE);
}
//构造方法,包含Strategy,是否忽略空字符,是否引入CharMatcher作为分割符,分割结果集最大长度
private Splitter(Strategy strategy, boolean omitEmptyStrings, CharMatcher trimmer, int limit) {
this.strategy = strategy;
this.omitEmptyStrings = omitEmptyStrings;
this.trimmer = trimmer;
this.limit = limit;
}