我应该使用哪种设计模式?

时间:2013-10-25 07:17:03

标签: java oop design-patterns

我正在开发app(使用java),用户应该能够填写表单并提交数据。当Internet连接可用时,应将数据提交给服务器,如果不可用,则提交到本地数据库(sqllite)。所以,我需要设计抽象数据提交目标。

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

赞赏意见和建议!

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

Strategy Pattern可以在这里为您提供帮助(一个策略界面和两个实现)。

  

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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对象来定义抛出的异常是否基于连接。