Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该使用哪种设计模式?_Java_Oop_Design Patterns - Fatal编程技术网

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

Java 我应该使用哪种设计模式?,java,oop,design-patterns,Java,Oop,Design Patterns,我正在开发应用程序(用java),用户应该能够填写表单并提交数据。当internet连接可用时,数据应提交到服务器,如果不可用,则提交到本地数据库(sqllite)。所以,我需要设计抽象数据提交目标 目前我正在考虑工厂方法,但我仍然不确定 欢迎提出意见和建议 在这里可以帮助您(一个策略接口和两个实现) 在计算机编程中,策略模式(也称为 策略模式)是一种软件设计模式,算法的 可以在运行时选择行为。从形式上讲,战略 模式定义了一系列算法,封装了每一个算法,并 使它们可以互换 可以在这里帮助您(一个策

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

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

欢迎提出意见和建议

在这里可以帮助您(一个策略接口和两个实现)

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

可以在这里帮助您(一个策略接口和两个实现)

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


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


编辑:甚至一个名字都是自我解释的。你有两种策略:如果没有联系,我会#1。如果有联系,我会

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


编辑:甚至一个名字都是自我解释的。你有两种策略:如果没有联系,我会#1。如果有联系,我会

事实上,工厂是相当合理的,但与战略模式相结合(如其他答案所示)

因此,您有一个界面:

interface FormSubmitter {
    public void submitForm(FormData data);
}
和两种实现(策略):

但您需要选择适当的战略,以下是工厂发挥作用的地方:

class FormSubmitterFactory {
    public static FormSubmitter getSubmitter() {
        if (connectionAvailable()) {
            return new ServerFormSubmitter();
        } else {
            return new LocalFormSubmitter();
        }
    }
}
然后,到时候您需要提交表格:

FormSubmitterFactory.getSubmitter().submitForm(formData);

事实上,工厂是相当合理的,但与战略模式相结合(如其他答案所示)

因此,您有一个界面:

interface FormSubmitter {
    public void submitForm(FormData data);
}
和两种实现(策略):

但您需要选择适当的战略,以下是工厂发挥作用的地方:

class FormSubmitterFactory {
    public static FormSubmitter getSubmitter() {
        if (connectionAvailable()) {
            return new ServerFormSubmitter();
        } else {
            return new LocalFormSubmitter();
        }
    }
}
然后,到时候您需要提交表格:

FormSubmitterFactory.getSubmitter().submitForm(formData);

我个人会选择decorator而不是策略。IMHO,策略更多地用于配置/逻辑流,而不是情景处理(在本例中为连接)。但这是基于观点的

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

if(connectionAvailable()){
// insert 1
} else {
// insert 2
}
Can在连接可用和插入之间具有竞争条件。但可能很少。这是我建议的设计:

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;
            }
        }
    }
}

困难的部分是,您需要定义抛出的异常是否基于连接,基于捕获的
异常
对象。

我个人会选择decorator而不是策略。IMHO,策略更多地用于配置/逻辑流,而不是情景处理(在本例中为连接)。但这是基于观点的

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

if(connectionAvailable()){
// insert 1
} else {
// insert 2
}
Can在连接可用和插入之间具有竞争条件。但可能很少。这是我建议的设计:

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;
            }
        }
    }
}

最困难的部分是,您需要定义抛出的异常是否基于连接,基于捕获的
异常
对象。

或者您可以链接它们,这意味着ServerFormSubmiter可以检查连接是否可用,如果不是这样,则委托给LocalFormSubmitter。但这难道不意味着ServerFormSubmitter要为太多的事情负责(提交到服务器并检查连接是否可用,如果不可用则委托工作)?这是透明处理此问题的另一个好方法(无需工厂)将创建策略的dispatcher实现(可以称为FormSubmitter),它将检查要使用并委托给它的实际策略(服务器、本地)。
DispatcherPerformSubmiter
确实是一个好主意:)或者您可以链接它们,这意味着ServerFormSubmitter可以检查连接是否可用,如果不是这样,则委托给LocalFormSubmitter。但这难道不意味着ServerFormSubmitter要为太多的事情负责(提交到服务器并检查连接是否可用,如果不可用则委托工作)?这是透明处理此问题的另一个好方法(无需工厂)这将是创建策略的调度程序实现(可以称为FormSubmitter),它将检查要使用并委托给它的实际策略(服务器、本地)。
dispatchPerformSubmiter
确实是一个好主意:)很好的方法。您对竞争条件的看法是正确的,我们不能保证调用submit方法时连接仍然可用。此设计的另一个好处是,此设计只与数据库建立一个连接,减少了往返开销。我相信OP在连接到internet后会继续运行,但您仍然是对的。方法不错。您对竞争条件的看法是正确的,我们不能保证调用submit方法时连接仍然可用。此设计的另一个好处是,此设计仅与数据库建立一个连接,减少了往返开销。我相信OP在连接到internet后仍将继续,但您仍然是正确的。