BaseActionのまとめ方

BaseActionは、Common functionalityをまとめるのに使われるんですが、BaseActionは普通のActionの他にDispatchActionや LookupDispatchActionを利用する場合もありますね。例えば、複数のLookupDispatchActionで共通のボタン処理がある場合、BaseLookupDispatchActionを用意してそこに共通のメソッドを書き込みます。 それとは別に、普通のActionにはBaseActionを用意します。それはそれで良いのですが、LookupDispatchActionも普通のActionも含めて、全てのアクションで使うcommon functionalityがある場合はどうすれば良いのでしょうか? BaseLookupDispatchActionとBaseActionの両方に同じコードをダブっていれることになりますよね。
で、実際私も考えたことがあって、ふと思いついたのが、そもそもBaseActionをLookupDispatchActionのサブクラスにしてしまうってことでした。パラメータの名前を"dispatch"に統一しておいて、executeメソッドの中で"dispatch"というパラメータがnullの場合は process()メソッドを呼び出し、dispatchがあればLookupDispatchActionの処理なのでsuper.execute() をリターンする、と。 で、普通のAction内ではexecuteの変わりにprocessメソッドを使って処理を行います。


public class BaseAction extends LookupDispatchAction{
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.back", "back");
map.put("button.save", "save");
...
return map;
}

public ActionForward execute (ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
//logging setup etc. ←common fanctionality

if(request.getParameter("dispatch") == null) {
return process(mapping, form, request, response);
}
return super.execute(mapping, form, request, response);


}
...

Actionで使う場合は:

public class SomeAction extends BaseAction{

public ActionForward process(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
...
return mapping.findForward("success");
}
LookupDispatchActionでは:

public class ContactAction extends BaseAction{
protected Map getKeyMethodMap() {
return super.getKeyMethodMap();
}

//各メソッド...
public ActionForward send (ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
return mapping.findForward("success");
}
この方法でいけることはいけるんですけど、何かねぇ、いいのかなぁって思ってたわけです。 そしたらば、ちょっと前にStruts MLで同じトピックがでてきてAshish KulkarniさんがInterfaceを使った方法を紹介してくれました[nagoya.apache.org]。まずCommonFunctionInterfaceってのを作って、それをimplementsするCommonFunctionってクラスの中で common処理をするわけですね。それで、BaseActionやBaseDispatchActionのサブクラスでこのCommonFunctionのインスタンスを作ってそれぞれのメソッドを呼び出すと、そういうことです。 サンプルコード:

public interface CommonFuntionInterface {
public String doSomething();
}

public class CommonFuntion implements CommonFuntionInterface {

public String doSomething() {
// to do logic
}
}

public MyAction extend Action {
private CommonFuntion common;

public ActionForward execute (ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {

common = new CommonFunction();
return performTask(mapping, form, request, response);
}

public String doSomething() {
return common.doSomething();
}
}

DispatchActionの中でも同様にします。
んー、どうでしょうねぇ…方法は一つではないんですが…。 皆さん(誰?)はどのようにしてるんでしょう?