I am trying to automate Business Process which can be characterized as a
pipeline with distinct stages
.Pipeline can be perceived as A->B->C, where A,B,C are distinct Business Steps that work on some common POJO.
Ad esempio, consideriamo questo processo aziendale:
Business needs to identify whether a Book can be sold in Indian Subcontinent.
Step 1. Ensure that the Book has a
specific Publisher P
Step 2. Fetch all editions of Book. The book can only be sold if the
edition is > 2.0
Step 3. Make sure that the
Price is < 5k
. If not check with the Publisher.
Questa è una pipeline semplice con 3 passaggi. Questi passaggi sono diversi l'uno dall'altro e dovrebbero essere progettati per una facile riutilizzabilità. For example, if tomorrow I need to work on a similar logic for US, I should be able to use Step 1, but for a different publisher.
Ho un'interfaccia come questa: -
interface Step {
// T pojo might vary based on which business problem is being solved.
// But the variation will be very slight. For example, different Business
// involving Books will typically work on multiple POJO's each having attributes of Books (with slight variations)
<T> void process(T pojo) throws Exception;
}
Per semplicità, diciamo che abbiamo 2 distinti processi aziendali nel subcontinente indiano & in noi. Potremmo aver seguito POJO.
class IndianBooks {
String publisher;
int price;
String importer; // this one is not present next POJO
...
}
class USBooks {
String publisher;
int price;
String printedAt; //this one is different from IndianBooks
...
}
Ogni passo Pipeline implementerebbe questo Step Interface
Ad esempio.
class FilterByPublisher implements Step {
//lets say FilterByPublisher is invoked by Business 1, which deals with Indian Subcontinent
// 'process' method should be able to operate on IndianBooks POJO
// if invoked by Pipeline2 which opearates on US Books this method should be
// able to handle USBooks POJO
void process(T pojo) {
1. needs to access publisher attribute of T
...
}
}
Ho pensato al seguente modo:
- utilizzando
instanceof
nel metodoprocess()
per verificare il tipo del POJO e quindi operare su di esso, quindi impostare l'altro attributo. %codice%
Ma in qualche modo ritengo che questo non sia un modo scalabile dato che ogni volta che una nuova pipeline entra in scena, dovrò aggiornare questo metodo.
Qualche input su come posso risolverlo efficacemente?
Aggiornamento: - Dopo aver esaminato il commento di @Jules, ho esaminato Visitor Pattern & pensato al seguente approccio.
Potrei mantenere l'interfaccia passo generica. Crea una classe Note that this change should be reflected in sub-sequent Stages
astratta che gestisca la logica di filtraggio. Crea 2 classi di filtri concreti (da utilizzare in diversi processi aziendali) che gestiscono solo l'input & passa alla classe FilterByPublisher
.
abstract class FilterByPublisher {
void filter(String publisher) {
..
}
}
class FilterByPublisher_IndianBusiness extends FilterByPublisher implements Step {
@Override
public <T> void process(T pojo) {
String publisher = ((IndianBooks)pojo).getPublisher(); // typecast
filter(publisher);
}
}
Sono possibili altre alternative.