将方法调用添加到类中的每个方法

时间:2012-03-27 08:50:01

标签: c# java design-patterns

我上课的方法很多:

public class A {
    public string method1() {
        return "method1";
    }
    public string method2() {
        return "method2";
    }
    public string method3() {
        return "method3";
    }
    .
    .
    .
    public string methodN() {
        return "methodN";
    }
}

我想在每个方法中添加对doSomething()的调用,例如:

public string methodi() {
    doSomething();
    return "methodi";
}

最好的方法是什么?有没有合适的设计模式?

4 个答案:

答案 0 :(得分:7)

这是AOP(面向方面​​编程)的典型用例。您将为方法调用定义插入点,AOP引擎会将正确的代码添加到类文件中。当您想要添加日志语句而不会混乱源文件时,通常会使用此方法。

对于java,您可以添加aspectj

对于C#和.NET,请查看this blog。看起来像一个好的首发。

答案 1 :(得分:5)

使用AOP已经是一个很好的答案,这也是我的第一个想法。

我试图找出一个没有AOP的好方法,并提出了这个想法(使用Decorator模式):

interface I {
  String method1();
  String method2();
  ...
  String methodN();
}

class IDoSomethingDecorator implements I {
  private final I contents;
  private final Runnable commonAction;

  IDoSomethingDecorator(I decoratee, Runnable commonAction){
    this.contents = decoratee;
    this.commonAction = commonAction;
  }

  String methodi() {
    this.commonAction().run();
    return contents.methodi();
  }
}

然后你可以装饰A的构造(它实现了我):

I a = new IDoSomethingDecorator(new A(),doSomething);

基本上没有火箭科学,实际上比你的第一个想法产生更多的代码,但是你能够注入共同的动作,并将附加动作与A类本身分开。此外,您可以轻松将其关闭或仅在测试中使用它。

答案 2 :(得分:1)

为什么不使用单一功能?

public string methodi(int i) {
    doSomething();
    return "method" + i.toString();
}

或者您可以编写一个函数,该函数接受Func参数并调用此函数而不是函数。

    public string Wrapper(Func<string> action)
    {
        doSomething();
        return action();
    }

并通过此功能调用您的函数;

string temp = Wrapper(method1);

答案 3 :(得分:0)

你可以使用反射。

public String callMethod(int i) {
  doSomething();  
  java.lang.reflect.Method method;    
  try {
    method = this.getClass().getMethod("method" + i);
  } catch (NoSuchMethodException e) {
    // ...
  }
  String retVal = null;
  try {
    retVal = method.invoke();
  } catch (IllegalArgumentException e) {
  } catch (IllegalAccessException e) {
  } catch (InvocationTargetException e) { }
  return retVal;
}