C'è un sacco di contenuti sul web che discutono se vale la pena definire un'interfaccia se solo una classe lo implementa. Le risposte sono per lo più o "Sì, perché probabilmente devi prenderlo in giro comunque" o "No, credo strongmente in YAGNI" .
Ma per quanto riguarda il restringimento dell'interfaccia pubblica delle classi?
Esempio:
public interface Picture {
public Dimension getSize();
public void resize(Dimension d);
// Some methods to retrieve byte data, etc
}
public class PictureImpl implements Picture {
// Implement inherited methods
public void setResizeStrategy(ResizeStrategy rs) { ... }
}
Non aggiungo intenzionalmente il metodo setResizeStrategy(..)
alla mia interfaccia, perché non voglio che altre classi accettino un oggetto Picture
per cambiare la strategia per il ridimensionamento (pensa a un upscaling lineare o usando una tecnica come l'antialiasing ).
In sostanza, restringo l'interfaccia pubblica di PictureImpl per il resto del mio programma, poiché utilizza solo l'interfaccia Picture
(seguendo la programmazione su un'interfaccia, non un metodo di implementazione).
Posso quindi nascondere la costruzione PictureImpl
effettiva in una sorta di contenitore di creazione, come una fabbrica:
public class PictureFactory {
public Picture createPicture() {
PictureImpl p = new PictureImpl();
// Search for a library that can resize pictures
// If a library is found that we can support return the corresponding strategy
// If no library is found, use our self coded linear upscale strategy
ResizeStrategy strat = ResizeStrategyResolver.findBestStrategyAvailable();
p.setResizeStrategy(strat);
return p;
}
}
Questo è un caso d'uso valido per le interfacce o sto usando male la tecnologia?
Nota: so che si potrebbe sostenere che la modifica della strategia durante il runtime potrebbe essere una caratteristica desiderata. Non sono riuscito a trovare un esempio migliore sul posto. Spero che tu abbia capito il punto che sto cercando di fare.