"L'Interfaccia-Segregation Principle (ISP) afferma che nessun client dovrebbe essere costretto a dipendere da metodi che non usa."
Il motivo decoratore è un motivo di progettazione per decorare un metodo di una classe. Per questo, il decoratore implementa la stessa interfaccia dell'oggetto decorato, in modo che possa prendere il suo posto.
Ma questo non significa che deve implementare tutti i metodi nell'interfaccia, quando ne usa solo uno, quello che decora? Quindi immagino che violi l'ISP. L'unico caso è che non è quando l'interfaccia decorata contiene solo il metodo che deve essere decorato, ma io lo vedo come un caso piuttosto raro.
Un esempio potrebbe essere che ci sono pagine in un libro. Alcune pagine hanno note a piè di pagina, altre pagine hanno titoli in alto. Quindi implementiamo questi extra come decoratori di un metodo, diciamo draw (). Ma una pagina ha anche altri metodi, diciamo: fold () e tear () e altri metodi possono venire in seguito. Ma se vogliamo usare versioni decorate di pagine inserite in un libro, e lavorando allo stesso modo, finiamo per implementare in ogni decoratore ogni metodo di una pagina, dove l'unica cosa che accade è che il decoratore passa la chiamata alla pagina è contenente.
interface IPage {
public ITearResult tear();
public void draw();
}
class FooterDecorator implements IPage {
private IPage page;
public FooterDecorator(IPage page) {
this.page = page; //the object it decorates
}
//violates the ISP, because it has to implement it, but it's not using it,
//just passes the operation
public ITearResult tear() {
return page.tear();
}
//decorated method
public void draw() {
page.draw();
... draw footer - the decoration
}
}
Non riesco a capire correttamente il modello di decorazione o l'ISP? È una violazione accettabile o questi due si contraddicono davvero?