package com.github.ompc.greys.core.util.matcher;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**
* 组匹配
* Created by vlinux on 15/11/1.
*/
public interface GroupMatcher<T> extends Matcher<T> {
/**
* 追加匹配器
*
* @param matcher 匹配器
*/
void add(Matcher<T> matcher);
/**
* 与关系组匹配
*
* @param <T> 匹配类型
*/
class And<T> implements GroupMatcher<T> {
private final Collection<Matcher<T>> matchers;
/**
* 与关系组匹配构造<br/>
* 当且仅当目标符合匹配组的所有条件时才判定匹配成功
*
* @param matchers 待进行与关系组匹配的匹配集合
*/
public And(Matcher<T>... matchers) {
this.matchers = Arrays.asList(matchers);
}
@Override
public boolean matching(T target) {
for (Matcher<T> matcher : matchers) {
if (!matcher.matching(target)) {
return false;
}
}
return true;
}
@Override
public void add(Matcher<T> matcher) {
matchers.add(matcher);
}
}
/**
* 或关系组匹配
*
* @param <T> 匹配类型
*/
class Or<T> implements GroupMatcher<T> {
private final Collection<Matcher<T>> matchers;
public Or() {
this.matchers = new ArrayList<Matcher<T>>();
}
/**
* 或关系组匹配构造<br/>
* 当且仅当目标符合匹配组的任一条件时就判定匹配成功
*
* @param matchers 待进行或关系组匹配的匹配集合
*/
public Or(Matcher<T>... matchers) {
this.matchers = Arrays.asList(matchers);
}
public Or(Collection<Matcher<T>> matchers) {
this.matchers = matchers;
}
@Override
public boolean matching(T target) {
for (Matcher<T> matcher : matchers) {
if (matcher.matching(target)) {
return true;
}
}
return false;
}
@Override
public void add(Matcher<T> matcher) {
matchers.add(matcher);
}
}
}