我正在开发应用程序(使用 java),用户应该能够在其中填写表格并提交数据。当互联网连接可用时,应将数据提交到服务器,如果没有,则提交到本地数据库(sqllite)。所以,我需要设计来抽象数据提交目标。
目前我正在考虑工厂方法,但我仍然不确定。
意见和建议表示赞赏!
我正在开发应用程序(使用 java),用户应该能够在其中填写表格并提交数据。当互联网连接可用时,应将数据提交到服务器,如果没有,则提交到本地数据库(sqllite)。所以,我需要设计来抽象数据提交目标。
目前我正在考虑工厂方法,但我仍然不确定。
意见和建议表示赞赏!
事实上,工厂将是相当合理的,但与战略模式相结合(正如其他答案中所注意到的)。
所以你有一个界面:
interface FormSubmitter {
public void submitForm(FormData data);
}
和两个实现(策略):
class ServerFormSubmitter implements FormSubmitter {
@Override
public void submitForm(FormData data) {
// submit to the server
}
}
class LocalFormSubmitter implements FormSubmitter {
@Override
public void submitForm(FormData data) {
// save to DB
}
}
但是你需要选择一个合适的策略,这就是工厂发挥作用的地方:
class FormSubmitterFactory {
public static FormSubmitter getSubmitter() {
if (connectionAvailable()) {
return new ServerFormSubmitter();
} else {
return new LocalFormSubmitter();
}
}
}
然后,到时候你需要提交表单:
FormSubmitterFactory.getSubmitter().submitForm(formData);
我个人会选择装饰者而不是策略。恕我直言,策略更多地用于配置/逻辑流程,而不是情境处理(在这种情况下是连接)。这是基于意见的。
此外,当做这样的事情时:
if(connectionAvailable()){
// insert 1
} else {
// insert 2
}
connectionAvailable
可以在和插入之间有竞争条件。不过可能很少。这是我建议的设计:
interface IFormSubmitter {
public void submitForm(FormData data);
}
public class SqlLiteFormSubmitter : IFormSubmitter{
public void submitForm(FormData data){
//insert into sqlite
}
}
public class DatabaseFormSubmitter : IFormSubmitter{
public class DatabaseFormSubmitter(IFormSubmitter reservedSubmitter){
// property assignment
}
public void submitForm(FormData data){
try{
// insert into database
}
catch(SQLException ex){
if( isConnectionError(ex) ){
reservedSubmitter.submitForm(data);
}
else{
throw e;
}
}
}
}
exception
困难的部分是,您需要根据捕获的对象定义抛出的异常是否基于连接。
策略模式可以在这里为您提供帮助(一个策略接口和两个实现)。
在计算机编程中,策略模式(也称为策略模式)是一种软件设计模式,可以在运行时选择算法的行为。从形式上讲,策略模式定义了一系列算法,封装了每一个,并使它们可以互换。
工厂方法用于创建对象。您需要选择提交表单的策略。哦,还有这样的模式!;-)
编辑:即使是一个名字也是自我解释的。你有两种策略:如果没有联系,我会#1。如果有连接我会#2。