我在类中有近10个函数具有类似跟随函数的模式
SQLiteDatabase database = this.getWritableDatabase();
try {
//Some different code , all other code(try,catch,finally) is same in all functions
} catch (SQLiteException e) {
Log.e(this.getClass().getName(), e.getMessage());
return false;
} finally {
database.close();
}
}
我想从所有函数中删除该公共代码(try,catch,finally)并将其移动到一个地方 我怎样才能做到这一点?
答案 0 :(得分:3)
有许多框架可以大大简化您可以使用的数据库交互,但是如果您想自己做事,并且对Java这样做的事情感兴趣,那么这就是:< / p>
让你的“执行者”如此:
public class Executor {
public static void runOperation(Operation operation) {
SQLiteDatabase database = this.getWritableDatabase();
try {
operation.run(database);
} catch (SQLiteException e) {
Log.e(operation.getClass().getName(), e.getMessage());
return false;
} finally {
database.close();
}
}
现在,您要做的10件事中的每件事都是操作:
public interface Operation {
void run(SQLiteDatabase database) throws SQLiteException;
}
以下是特定操作的样子:
Operation increaseSalary = new Operation() {
public void run(SQLiteDatabase database) throws SQLiteException {
// .... write the new increased salary to the database
}
};
然后用:
运行它.
.
Executor.runOperation(increaseSalary);
.
.
您还可以将接口的实现设置为匿名内部类,但这可能会使其可读性降低。
.
.
Executor.runOperation(new Operation() {
public void run(SQLiteDatabase database) throws SQLiteException {
// put the increase salary database-code in here
}
});
.
.
您可以查看经典设计模式列表,找出它是哪一个。
答案 1 :(得分:1)
要进一步扩展Ray Toal's original answer,,值得注意的是,使用匿名内部类将有助于避免为每个操作创建单独的类文件。所以具有10个左右函数的原始类可以保持相同的方式,除了被重构为使用Executor
模式。
此外,使用Executor
模式时,您必须在原始代码中使用this
。假设原始函数如下:
public boolean operation1() {
SQLiteDatabase database = this.getWritableDatabase();
try {
//Code for Operation 1
return true;
} catch (SQLiteException e) {
Log.e(this.getClass().getName(), e.getMessage());
return false;
} finally {
database.close();
}
}
public boolean operation2() {
SQLiteDatabase database = this.getWritableDatabase();
try {
//Code for Operation 2
return true;
} catch (SQLiteException e) {
Log.e(this.getClass().getName(), e.getMessage());
return false;
} finally {
database.close();
}
}
Executor
类的定义如下:
public class Executor {
public static boolean runOperation(SQLiteOpenHelper helper, Operation operation) {
SQLiteDatabase database = helper.getWritableDatabase();
try {
operation.run(database);
return true;
} catch (SQLiteException e) {
Log.e(helper.getClass().getName(), e.getMessage());
return false;
} finally {
database.close();
}
}
}
Operation
接口定义如下:
public interface Operation {
public void run(SQLiteDatabase database) throws SQLiteException;
}
现在可以按如下方式重写原始函数:
public boolean operation1() {
return Executor.runOperation(this, new Operation() {
public void run(SQLiteDatabase database) throws SQLiteException {
//Code for Operation 1
}
});
}
public boolean operation2() {
return Executor.runOperation(this, new Operation() {
public void run(SQLiteDatabase database) throws SQLiteException {
//Code for Operation 2
}
});
}
此扩展也纠正了Ray在其原始答案中忽略的错误。