Прошу совета как правильно сделать то, что мне нужно. Чую что что-то не так в написанном коде.
Итак. Изначально была необходимость в функции фильтрации. Фильтрация происходит разными способами, основные методы и зависимости описаны в абстрактном классе. Было что-то вроде:
public abstract class AbstractFilter implements Filter
{
//beans definitions
@Override
public boolean filter(String color)
{
//implementation
}
public boolean isWarm(String color)
{
//implementation
}
public boolean isDark(String color)
{
//implementation
}
public boolean isNeon(String color)
{
//implementation
}
}
public class WarmDarkFilter extends AbstractFilter
{
@Override
public boolean filter(String color)
{
return super.filter(color)&&isWarm(color)&&isDark(color);
}
}
public class NeonBrightFilter extends AbstractFilter
{
@Override
public boolean filter(String color)
{
return super.filter(color)&&isNeon(color)&&!isDark(color);
}
}
...
Когда пришла необходимость добавить еще пару классов в таком же стиле было принято решение отрефакторить и упростить эту структуру. Переделано так:
public class ColorFilter extends AbstractFilter
{
private Function<String, Boolean> filteringFunction;
ProductFilter(FilteringFunction filteringFunctionEnum)
{
this.filteringFunction = getFilteringFunction(filteringFunctionEnum);
}
@Override
public boolean filter(String color)
{
return filteringFunction.apply(color);
}
private Function<String, Boolean> getFilteringFunction(final FilteringFunction filteringFunction)
{
Function<String, Boolean> function = null;
if (WARM_DARK.equals(filteringFunction))
{
function = (String color) -> super.filter(color)&&isWarm(color)&&isDark(color);
}
else if (NEON_BRIGHT.equals(filteringFunction))
{
function = (String color) -> super.filter(color)&&isNeon(color)&&!isDark(color);
}
...
else
{
throw new BeanInitializationException("Filtering function can't be null");
}
return function;
}
public enum FilteringFunction
{
WARM_DARK, NEON_BRIGHT,...;
}
Соответственно вместо объявления 100500 бинов теперь просто указывается нужная опция в конструкторе.
<property name="colorFilter">
<bean class = "com.lor.ColorFilter" parent="abstractFilter">
<constructor-arg value="WARM_DARK"/>
</bean>
</property>
Как можно улучшить этот код? вернуться к подходу 100500 классов? Создать factoryMethod? Discuss please.