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