我有一个类包含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也是类似的。这里有很多重复的代码。我觉得有更好的方法来实现这一点,但不知道如何实现。任何想法和建议表示赞赏。
谢谢, 萨拉
答案 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)
不要发送长参数列表,只需按下地图中的所有参数,然后将该地图作为参数发送。