0

我有两个扩展 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)
}

请建议最好的方法。

4

1 回答 1

0

我建议实施模板方法模式。你可以有你的基本控制器是这样的:

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,您可以简单地扩展父级而不更改它。

更新:根据评论,这是另一种方法。

  • 我不会将它作为一个设置器,而是我会在基类上创建一个构造函数参数,它将子类的类型作为参数。这可确保编译器强制您始终拥有一个值集

  • 您可以使用 aboolean但我强烈建议使用 a EnumString常量或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 世纪,Java 创建一个Enum将是首选的方式。

于 2013-09-23T22:38:36.133 回答