我有两个扩展basecontroller的控制器类。我有一个共同的功能要实现,实现在basecontroller中。
public class BaseController{
protected void populateWidget(List li, int zipcode){
//implementation for child A
populate only 10 employee records
//implementation specific to child B
populate 100 student records
}
}
public class ChildA extends BaseController{
List<Employees> li = ...
populateWidget(li, 90034)
}
public class ChildB extends BaseController{
List<Students> li = ...
populateWidget(li, 90034)
}
我编写了setChildB方法并正在处理它。如下所示
public class BaseController{
protected boolean childB;
protected void setIsChildB(boolean childB){ this.childB = childB;}
protect boolean isChildB(){ return childB; }
protected void populateWidget(List li, int zipcode){
//implementation for child A
if(!isChildB())
populate only 10 employee records
else
//implementation specific to child B
populate 100 student records
}
}
public class ChildA extends BaseController{
List<Employees> li = ...
populateWidget(li, 90034)
}
public class ChildB extends BaseController{
List<Students> li = ...
setChildB(true); //setting as child B call
populateWidget(li, 90034)
}
请建议最好的方法。
答案 0 :(得分:0)
我建议实施Template Method Pattern。您可以像这样使用基本控制器:
public class BaseController {
protected abstract void getPeople(List li, int zipcode);
protected void populateWidget(List li, int zipcode) {
//Do generic logic here
//Refer to child
getPeople(List li, int zipcode)
//Do some more generic stuff
}
}
然后你的每个孩子都这样:
public class ChildA extends BaseController {
@Override
protected void getPeople(List li, int zipcode) {
//Specific Logic here
}
}
每个孩子都会覆盖getPeople()
方法来做自己的事情。
这样,如果您需要ChildC,您可以直接扩展父级而不需要更改它。
更新:根据评论,这是另一种方法。
我不会把它作为一个setter,而是我会在基类上创建一个构造函数参数,它将子类型作为参数。这可以确保编译器强制您始终具有值集
您可以使用boolean
,但我建议您强烈使用Enum
,String
常量或int
常量。
以上两点主要是因为我总是预计,当某些需求发生变化时,我可能不得不做一个ChildC,此时您不必对基类进行更改。它也属于我工作的其他程序员期望的模式集,因此使代码更容易阅读和维护。
示例基类:
public class BaseController {
private int childType;
protected static final int CHILD_A = 1;
protected static final int CHILD_B = 2;
public BaseController(int aChildType) {
childType = aChildType;
}
protected void populateWidget(List li, int zipcode) {
switch (childType) {
case CHILD_A:
//Handle Child A
case CHILD_B:
//Handle Child B
}
}
}
子实现看起来像这样:
public class ChildA extends BaseController {
public ChildA () {
super(CHILD_A);
}
//The rest of your code goes here...
}
注意,在上面的例子中,为了简洁起见,我使用整数常量。在21世纪,创建Enum
的Java将是首选方式。