package jdepend.knowledge.pattern.impl1;
import java.util.ArrayList;
import java.util.Collection;
import jdepend.knowledge.pattern.PatternInfo;
import jdepend.metadata.JavaClass;
import jdepend.metadata.Method;
import jdepend.model.JavaClassUnit;
public final class StateIdentifyer extends AbstractPatternIdentifyer {
@Override
public String getExplain() {
StringBuilder explain = new StringBuilder();
explain.append(" <strong>状态模式</strong><br>");
explain
.append(" 1、本身是接口或抽象类;2、存在多个子类;3、子类覆盖了父类方法;4、父类方法是抽象方法;5、该方法返回值是父类;6、父类是有状态的。<br><br>");
return explain.toString();
}
@Override
public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) {
Collection<PatternInfo> rtn = new ArrayList<PatternInfo>();
for (JavaClassUnit javaClass : javaClasses) {
if (javaClass.getJavaClass().isAbstract() && javaClass.getJavaClass().isState()) {
Collection<JavaClass> subClasses = javaClass.getJavaClass().getSubClasses();
if (subClasses.size() > 1) {
L: for (JavaClass subClass : subClasses) {
for (Method method : subClass.getSelfMethods()) {
if (!method.isConstruction() && method.getReturnTypes().size() == 1
&& method.getReturnClassTypes().size() == 1
&& method.getReturnClassTypes().iterator().next().equals(javaClass)) {
for (Method superMethod : javaClass.getJavaClass().getSelfMethods()) {
if (superMethod.isAbstract() && method.isOverride(superMethod)) {
rtn
.add(new PatternInfo(javaClass.getJavaClass(), javaClass.getName() + "."
+ method.getName()));
break L;
}
}
}
}
}
}
}
}
return rtn;
}
}