package jdepend.knowledge.pattern.impl1;
import java.util.ArrayList;
import java.util.Collection;
import jdepend.knowledge.pattern.PatternInfo;
import jdepend.metadata.Attribute;
import jdepend.metadata.JavaClass;
import jdepend.metadata.Method;
import jdepend.model.JavaClassUnit;
public class FlyweightIdentifyer extends AbstractPatternIdentifyer {
@Override
public String getExplain() {
StringBuilder explain = new StringBuilder();
explain.append(" <strong>享元模式</strong><br>");
explain.append(" 1、存在集合属性;2、属性存在子类;3、存在返回该属性的方法,并且存在参数;4、方法内部使用了集合属性。<br><br>");
return explain.toString();
}
@Override
public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) {
Collection<PatternInfo> rtn = new ArrayList<PatternInfo>();
for (JavaClassUnit javaClass : javaClasses) {
// 是否存在集合属性
M: for (Attribute attribute : javaClass.getJavaClass().getAttributes()) {
if (attribute.existCollectionType()) {
// 是否存在子类
for (JavaClass attributeClass : attribute.getTypeClasses()) {
if (attributeClass.getSubClasses().size() > 1) {
// 是否存在返回属性的方法,并且存在参数;方法内部使用了集合属性
for (Method method : javaClass.getJavaClass().getSelfMethods()) {
for (JavaClass rtnClass : method.getReturnClassTypes()) {
if (attribute.getTypeClasses().contains(rtnClass)) {
if (method.getArgumentCount() > 0) {
if (method.getReadFields().contains(attribute)) {
rtn.add(new PatternInfo(javaClass.getJavaClass(), javaClass.getName() + "."
+ attribute.getName()));
break M;
}
}
}
}
}
}
}
}
}
}
return rtn;
}
}