Рассмотрим отношения между Dog
и Collar
: a Dog
has-a Collar
.
Другими словами, addCollar()
и removeCollar()
являются действиями Dog
поэтому эти методы принадлежат Dog
:
public class Dog {
public addCollar(){
//adds collar
}
public removeCollar(){
//removes collar
}
}
То же самое для Cat
, Bird
и т. д. Код все еще дублируется на этом этапе.
Тогда контроллер может просто делегировать:
@Named(value = "dogController")
@ViewScoped
public class DogController implements Serializable {
private Dog dog; // Class Dog has a List<Collar>
private Collar collar = new Collar(); // to be used in an XHTML form
public addCollar(){
//adds collar in dog
dog.addCollar();
}
public removeCollar(){
//removes collar from dog
dog.removeCollar();
}
}
То же самое для контроллеров Cat
, Bird
и т. Д.
Теперь общий код можно поместить в одинкласс, такой как:
public class CollarHandler {
private List<Collar> collars;
public addCollar(){
//adds collar
}
public removeCollar(){
// remove a collar;
}
}
И конструктор Dog
принимает CollarHandler
, а его методы делегируются обработчику:
public class Dog {
private CollarHandler collarHandler;
public Dog(CollarHandler collarHandler) {this.collarHandler = collarHandler; }
public addCollar(){
collarHandler.addCollar();
}
public removeCollar(){
collarHandler.removeCollar();
}
}
То же самое для Cat
,Bird
и т. Д.
Нет ни общего интерфейса, ни наследования.Каждый контроллер все еще независим, но его поведение может быть общим.