Reputation: 114
I am currently reading about design patterns and their uses. I am trying to find a design pattern to use to re-factor my current code.
Problem:
Load data from several different sources in a certain order into one large JavaBean. Data is loaded based on some simple initial criteria. Data returned from the first source will build criteria for the next source.
It is possible that no data may return from certain data sources. This may not stop the load process into the JavaBean, but based on some logic the load process may skip certain data sources because it doesn't have enough criteria to query.
Current Solution:
BigJavaBean Class
Each loader class contains methods to access each source DAOs
Queries to each DAOs are built from attributes in the BigJavaBean
There is logic in each loader class to determine if its "loaded" or not
LoaderClassDataBase for BigJavaBean
LoaderClassFlatFiles for BigJavaBean
LoaderClassXmlFiles for BigJavaBean
LoaderClassWebService for BigJavaBean
... and so on
MainLogicClass
BigJavaBean bigJavaBean = new BigJavaBean();
populateBigBeanMethod() {
loaderClassDataBase(bigJavaBean);
if (loaderClassDataBase.isLoaded()) {
loaderClassFlatFiles(bigJavaBean);
if (loaderClassFlateFile.isLoaded() {
loaderClassXmlFiles(bigJavaBean);
}
}
... more if statements
}
Thanks.
Upvotes: 6
Views: 3035
Reputation: 66
This is Chain Of Responsibility pattern
abstract class BigJavaBeanLoader {
private final BigJavaBeanLoader successor;
public BigJavaBeanLoader() {
this.successor = null;
}
public BigJavaBeanLoader(BigJavaBeanLoader successor) {
this.successor = successor;
}
public void loadData(BigJavaBean bean) {
if (this.loadDataFromSource(bean) && this.successor != null) {
this.successor.loadData(bean);
}
}
protected abstract boolean loadDataFromSource(BigJavaBean bean);
class DataBase extends BigJavaBeanLoader {
@Override
protected boolean loadDataFromSource(BigJavaBean bean) {
// do a database stuff
return true;
}
}
class FlatFiles extends BigJavaBeanLoader {
@Override
protected boolean loadDataFromSource(BigJavaBean bean) {
// do flat files stuff
return true;
}
}
}
BigJavaBean bigJavaBean = new BigJavaBean();
BigJavaBeanLoader loader;
loader = new BigJavaBeanLoader.FlatFiles();
loader = new BigJavaBeanLoader.DataBase(loader);
loader.loadData(bebigJavaBean);
Upvotes: 2
Reputation: 530
To me, this screams for a state pattern (there are cleaner implementations than this but I've not had enough coffee).
public abstract class LoaderState {
private BigBean bean;
public LoaderState(BigBean b) { this.bigBean = b; }
public abstract LoaderState getNextLoader();
public abstract void loadData();
class DatabaseLoaderState extends LoaderState {
public void loadData() { //do some stuff }
public LoaderState getNextLoader() {
if (iHadSomeData) return new FlatFileLoaderState(bigBean);
return new SomeOtherLoaderState(bigBean); //or return null if nothing else to do
}
}
}
LoaderState state = new LoaderState.DatabaseLoaderState(new BigBean());
do {
state.loadData();
state = state.getNextLoader();
} while (state != null);
Upvotes: 1