删除重复

时间:2010-08-03 07:01:18

标签: java

我有一个类包含10个方法,除了一个键事件之外,它们几乎完成相同的操作。下面给出两个例子:


Public String ATypeOperation(String pin, String amount){
    doSomething();
    doMoreStuff();
    requestBuilder.buildATypeRequest(pin, amount);
    doAfterStuff();
}



Public String BTypeOperation(String name, String sex, String age){
    doSomething();
    doMoreStuff();
    requestBuilder.buildBTypeRequest(name, sex, age);
    doAfterStuff();
}

从上面的方法可以看出,它们与调用requestBuilder提供的不同方法类似。其余的8也是类似的。这里有很多重复的代码。我觉得有更好的方法来实现这一点,但不知道如何实现。任何想法和建议表示赞赏。

谢谢, 萨拉

6 个答案:

答案 0 :(得分:5)

使用类似RequestBuilder的内容,它接受所有这些参数:

public RequestBuilder {
    // setters and getters for all properties

    public Request build() {
         doStuff();
         Request request = new Request(this);
         doAfterStuff();
         return request;
    }
}

然后

new RequestBuilder().setAge(age).setName(name).build();

答案 1 :(得分:3)

答案 2 :(得分:2)

interface RequestBuilder {
  void doStuff(params);
}

public RequestBuilder getARequestBuilder() {
  return new RequestBuilder() {
    void doStuff(params) {  
      // impl.details
    }
  }
}    

public RequestBuilder getBRequestBuilder() {
  return new RequestBuilder() {
    void doStuff(params) {  
      // impl.details
    }
  }
}    

public String buildRequest(yourParams, RequestBuilder builder){
  doBefore();
  builder.doStuff(yourParams);
  doAfter();
}

我认为这被称为Strategy模式。它看起来很像Command模式,但因为你封装了一个算法,它似乎是策略:)

Bozho建议的是Builder模式。

我建议您浏览a list of patterns一段时间,或购买Head First Patterns。阅读真的很有趣。

答案 3 :(得分:1)

您可以将构建器对象传递给通用的buildRequest方法。由于不仅算法而且参数不同,我将它们放入构建器中。我不认为这是一个很好的解决方案,但我想在这里显示一个命令模式:D(Extraneon展示了如何解耦params和命令)

    // call somewhere in the code:
    Builder b = new BTypeBuilder();
    b.age = "20"; b.sex = "female"; b.name = "eve";
    String res = buildRequest(b);

    Public String buildRequest(Builder builder)
    {
        doSomething();
        doMoreStuff();
        builder.build();
        doAfterStuff();
    }

    // Command pattern
    class BTypeBuilder implements Builder
    {
        String name, age, sex;

        // Constructor here

        void build() 
        {
            // Do your stuff here
        }
    }

    class ATypeBuilder implements Builder
    {
        String pin, amount;

        // Constructor here

        void build() 
        {
            // Do your stuff here
        }
    }

    public interface Builder 
    { 
        void build();
    }

答案 4 :(得分:0)

除了其他答案之外,这也可能对您有用(如果您只想插入方法,而不是使用'之前'和'之后'方法的参数)

interface Function0<R> {
    R apply();
}

public void performOperation(Function0<Void> operation) {
    doSomething(); 
    doBeforeStuff(); 
    operation.apply();
    doAfterStuff(); 

}

然后你可以像这样使用它,

    final RequestBuilder builder = new RequestBuilder();
    performOperation(new Function0<Void>() {
        public Void apply() {
            builder.buildATypeRequest("1234", "2445");
            return null;
        }
    });

    performOperation(new Function0<Void>() {
        public Void apply() {
            builder.buildBTypeRequest("1234", "2445", "1234");
            return null;
        }
    });

答案 5 :(得分:0)

不要发送长参数列表,只需按下地图中的所有参数,然后将该地图作为参数发送。