我正在开发app(使用java),用户应该能够填写表单并提交数据。当Internet连接可用时,应将数据提交给服务器,如果不可用,则提交到本地数据库(sqllite)。所以,我需要设计抽象数据提交目标。
此刻我正在考虑工厂方法,但我仍然不确定。
赞赏意见和建议!
答案 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
对象来定义抛出的异常是否基于连接。