La mia domanda riguarda il principio polimorfico Open-Closed.
Dire che ho il seguente client:
public class Client {
private Server server;
public Client(Server server) {
this.server = server;
}
public void purchase() {
server.processPurchase(new Purchase());
}
}
Questa è l'astrazione per il server:
public interface Server {
void processPurchase(Purchase purchase);
}
E l'implementazione per il server:
public class ServerImpl implements Server {
@Override
public void processPurchase(Purchase purchase) {
System.out.println("Processing purchase" + purchase);
processPayment(purchase);
}
private void processPayment(Purchase purchase) {
System.out.println("Processing payment" + purchase);
}
}
Questo caso di utilizzo minimalista riguarda l'esecuzione di un acquisto.
Ora dì che uno vuole eseguire un'altra azione quando elaboro l'acquisto, ad esempio:
- aggiungi le informazioni di acquisto a un database per essere successivamente utilizzate per suggerimenti di apprendimento automatico
- invia un'email di conferma all'utente
- ecc.
Quale sarebbe il modo migliore per ottenere il cambiamento pur rispettando l'OCP?
La mia prima idea è scrivere una seconda implementazione e scambiarla dalla prima come segue:
public class ServerImpl2 implements Server {
@Override
public void processPurchase(Purchase purchase) {
System.out.println("Processing purchase" + purchase);
processPayment(purchase);
sendConfirmationEmail(purchase);
}
private void processPayment(Purchase purchase) {
System.out.println("Processing payment" + purchase);
}
private void sendConfirmationEmail(Purchase purchase) {
System.out.println("Sending confirmation email");
}
}
C'è un altro modo? Qualsiasi input o suggerimento benvenuto.