如何检查来自哪个特定的子控制器?

时间:2013-09-23 22:00:10

标签: spring spring-mvc inheritance

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

请建议最好的方法。

1 个答案:

答案 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,但我建议您强烈使用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世纪,创建Enum的Java将是首选方式。