0

我正在开发应用程序(使用 java),用户应该能够在其中填写表格并提交数据。当互联网连接可用时,应将数据提交到服务器,如果没有,则提交到本地数据库(sqllite)。所以,我需要设计来抽象数据提交目标。

目前我正在考虑工厂方法,但我仍然不确定。

意见和建议表示赞赏!

4

4 回答 4

3

事实上,工厂将是相当合理的,战略模式相结合(正如其他答案中所注意到的)。

所以你有一个界面:

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);
于 2013-10-25T07:41:31.457 回答
1

我个人会选择装饰者而不是策略。恕我直言,策略更多地用于配置/逻辑流程,而不是情境处理(在这种情况下是连接)。这是基于意见的。

此外,当做这样的事情时:

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困难的部分是,您需要根据捕获的对象定义抛出的异常是否基于连接。

于 2013-10-25T08:34:13.700 回答
1

策略模式可以在这里为您提供帮助(一个策略接口和两个实现)。

在计算机编程中,策略模式(也称为策略模式)是一种软件设计模式,可以在运行时选择算法的行为。从形式上讲,策略模式定义了一系列算法,封装了每一个,并使它们可以互换。

于 2013-10-25T07:19:06.677 回答
1

工厂方法用于创建对象。您需要选择提交表单的策略。哦,还有这样的模式!;-)

编辑:即使是一个名字也是自我解释的。你有两种策略:如果没有联系,我会#1。如果有连接我会#2。

于 2013-10-25T07:22:40.843 回答