假设我有一个多维数组作为类的成员和许多方法,它循环遍历数组的每个元素然后对其进行操作。代码可能如下所示:
public class Baz {
private Foo[][] fooArray = new Foo[100][100];
public Baz() {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
// Initialize fooArray
}
}
}
public void method1() {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
// Do something with fooArray[i][j]
}
}
}
public void method2() {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
// Do something else with fooArray[i][j]
}
}
}
// and so on
}
现在,由于循环的代码总是相同的,只有循环内的操作发生了变化,循环代码是否有可能以某种方式被重构为单独的方法?能够做到这一点真是太好了
doInLoop(functionToExecute());
如果可能的话,最接近做这样的事情会是什么?
答案 0 :(得分:6)
您正在寻找的是 Command 模式:定义单方法接口并将其作为匿名类实现为每个用例。您将此接口的实例传递给一个方法,该方法执行所有样板并仅为有趣的部分调用您的方法:
public void forAllMembers(Foo[][] fooArray, Command c) {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
c.execute(fooArray[i][j]);
}
}
}
或者,等待Java 8,它将引入Lambdas,并将为您的问题提供一流的解决方案!
答案 1 :(得分:2)
你可能会这样:
public void method1(Performer p) {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
p.doIt(fooArray[i][j]);
}
}
}
static interface Performer {
public void doIt(int ij);
}
然后实现不同的表演者并将它们传递给这个单一的方法。
此方法称为Command Pattern
答案 2 :(得分:2)
public Baz() {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
fooArray[i][j] = initArray(/* .. */);
doSomethingWithFooArray(fooArray[i][j] );
doSomethingElseWithFooArray(fooArray[i][j] );
}
}
}
如果您想创建通用的东西,可以使用Interface
,
public interface FooItf{
public void doSomethingWithFooArray(int value );
public void doSomethingElseWithFooArray(int value );
public int initArray(/* .. */);
}
现在你可以写点什么:
public looping(FooItf foo) {
for (int i = 0; i < fooArray.length; i++) {
for (int j = 0; j < fooArray[i].length; j++) {
fooArray[i][j] = foo.initArray(/* .. */);
foo.doSomethingWithFooArray(fooArray[i][j] );
foo.doSomethingElseWithFooArray(fooArray[i][j] );
}
}
}
现在,您可以根据FooItf
生成多个类,并实现任何内部逻辑。