Questo sembra un tipico caso d'uso per un modello di metodo del modello ; avere una classe che ha 7 metodi, 6 per ogni passo corrispondente e un metodo che richiama tutti gli altri 6 metodi in ordine. I metodi che possono cambiare li rendono astratti e vengono implementati per loro in sottoclassi; per esempio crea sottoclassi per UTF-8 e per altre codifiche; lo stesso per altri metodi che possono molto. In modo semplificato:
public abstract class StringProcessor {
public void perform() {
generateGuid();
generateEncoding();
//...
}
protected void generateGuid() {
//logic
}
protected abstract void generateEncoding();
}
public class Utf8EncodingStringProcessor extends StringProcessor {
protected generateEncoding() {
//UTF-8 logic
}
}
public class OtherEncodingStringProcessor extends StringProcessor {
protected generateEncoding() {
//Other logic
}
}
Questo non sarebbe così utile se hai bisogno di UTF-8 con algoritmo hashing 1, UTF-8 con algoritmo hasing 2, altra codifica con algoritmo hashing 1, altra codifica con algoritmo hash 2 ecc. Se ti serve molta flessibilità I consigliamo di utilizzare il modello di metodo del modello combinato con schema di strategia per ogni metodo che può variare. Potrebbe sembrare qualcosa di semplificato:
public abstract class StringProcessor {
private Encoding encoding;
private Hashing hashing;
public StringProcessor(EncodingType encodingType, HashingType hashingType) {
if (UTF8.equals(encodingType)) {
encoding = new Utf8Encoding();
} else if( ....)
}
public void perform() {
generateGuid();
encoding.encode();
hashing.generateHash();
//...
}
public void generateGuid() {
//logic
}
}
public enum EncodingType {
UTF8, OTHER, //...
}
public interface Encoding {
void encode();
}
public class Utf8Encoding implements Encoding {
public void encode() {
//UTF-8 logic
}
}
Generatore e catena di responsabilità non sembrano funzionare poiché il builder ti consente di creare solo un oggetto parziale, ma devi chiamare tutti i metodi; anche la catena di responsabilità non è utile dal momento che devi sempre delegare la parte superiore della gerarchia e raggiungere sempre la parte superiore del comando per chiamare tutti i metodi.