我检测到我正在语义化地重复命名的bean中的代码,因此我正在寻找一种重组代码的方法。
例如,我有三个命名的bean,它们重复了有关Collars的这段代码:
@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
}
public removeCollar(){
//removes collar from dog
}
}
因此,豆CatController
和BirdController
也具有相同的代码。 Photo
也会发生同样的情况,所有这些重复代码。所以我认为我在这里落后了。
我的直接步骤是为interface HasCollar
,Dog
和Cat
创建一个Bird
。然后,将重复的代码移到新的bean中:
@Named(value = "collarController")
@ViewScoped
public class CollarController implements Serializable {
private HasCollar animal;
private Collar collar = new Collar(); // to be used from the XHTML
....
public addCollar(){
//adds collar in animal
}
public removeCollar(){
//removes collar from animal
}
}
到目前为止,一切都很好。我现在的问题是:
animal
?尤其是因为同一XHTML可能同时使用Dog
和Cat
。之前还不错,因为每种类型都有一个Collar
对象。如果必须注射,我不知道如何注射。 (该问题似乎与this类似,但略有不同)。CollarController
扩展命名的bean,并重用所有功能,但这是不可能的,因为命名的bean已经继承自另一个类。那么,我如何重构这种情况以减少重复的代码?
(请让我知道是否需要更多信息)
答案 0 :(得分:1)
考虑Dog
和Collar
之间的关系:一个Dog
有一个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
等相同。
没有通用接口也没有继承。每个控制器仍然是独立的,但是行为可以共享。