java重构命名bean以避免代码重复
我检测到我正在系统地重复命名bean中的代码,因此我正在寻找一种方法来重新组织代码
例如,我有三个命名bean,它们重复了关于项圈的代码:
@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
}
}
所以bean CatController
和BirdController
也有相同的代码。同样的情况也发生在Photo
上,它们都重复代码。所以我想我是在一个模式后面
我的直接步骤是为Dog
、Cat
和Bird
创建一个interface HasCollar
。然后我将重复的代码移动到一个新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已经从另一个类继承李>
因此,我如何重构这种情况,以尽可能减少重复代码强>
(如果需要更多信息,请告诉我)
# 1 楼答案
考虑^ {CD1>}和^ {< CD2>}之间的关系:A^ {} HAS-^ {}。
换句话说,
addCollar()
和removeCollar()
是Dog
的动作,因此这些方法属于Dog
内部:与
Cat
、Bird
等相同。此时代码仍然重复然后,控制器可以简单地委托:
同样适用于
Cat
、Bird
等控制器现在,通用代码可以放在一个类中,例如:
和
Dog
的构造函数接受CollarHandler
,其方法委托给处理程序:同样适用于
Cat
、Bird
等没有公共接口或继承。每个控制器仍然是独立的,但行为可以共享