2012-03-31 70 views
1

我有创建,更新,删除和选择操作的用户界面,所以为了这个,我想到了用命令模式如何实现的CRUD操作

MyServlet

public void doGet(HttpServletRequest req,HttpServletResponse res) 
    throws ServletException,IOException 
    { 

InsertCommand insertCommnd = new InsertCommand(); 
DeleteCommand deleteCommnd = new DeleteCommand(); 

设计其命令模式//创建DTO员工与请求参数并把它传递给调用者

if(req.getParameter("action").equals("insert")) 

    Invoker invoker = new Invoker(); 

invoker.setCommand(insertCommnd); 
invoker.pressButton(emp); 


    } 

// * 祈求 *

public class Invoker 
{ 
    private Command command; 

    public void setCommand(Command command) 
    { 
     this.command = command; 
    } 


    public void pressButton(Employee emp) 
    { 
     command.execute(emp); 
    } 

} 

// 命令的.java

public interface Command 
{ 
public void execute(); 
} 

的DeleteCommand的.java

public DeleteCommand implements Command 
{ 

Employee emp; 

public DeleteCommand(Employee emp) 
{ 

this.emp = emp; 
} 

public void execute() 
{ 
// SQL Query to delete Records 
} 

} 

InsertCommand.java

public InsertCommand implements Command 
    { 
    Employee emp ; 
    public InsertCommand(Employee emp) 
    { 

    this.emp = emp; 
    } 

    public void execute() 
    { 
    // SQL Query to insert Records 
    } 

    } 

同样有一个更新记录命令

我的问题是,我怎么能解决这个在选择操作的情况下,因为它从数据库返回的ArrayList?

也请分享你对这个设计的想法,因为我是设计软件的新手。

回答

1

你是正确的方法,这意味着你正试图在你的代码中使用设计模式。
在你的情况下,你正在使用错误的pattern.You应该使用DAO模式。

但是说错了并不意味着你的方法无法使用。它只是DAO是DB的标准。

在你的情况你的问题是你的execute方法返回void,你需要一个方法(额外),返回List

您可以为选择返回List第二种方法,并给它一个通用名称,并在你的其他指令只是抛出一个异常UnsupportedMethod

例如

public interface Command 
{ 
public void execute(); 
public List fetch(); 
} 
+0

这是“简单的\”巴掌一切\“”的方法,我在我的答案提及。它的确比CQRS更普遍,并且在大多数情况下完全有效。有些情况下CQRS更适合,所以“错误的模式”有点过于强调IMO(我自己的“一巴掌”措辞可能有点过于苛刻)。两者都是有效的,DAO更容易和更普遍。 – Barend 2012-03-31 08:21:19

+0

@ user384706谢谢,所以你的意思是说,如果返回类型将是相同类型知道的情况下去命令模式? – Pawan 2012-03-31 08:22:26

+0

@ yyyi777一个不错的可靠方法是使命令类实现'java.util.concurrent.Future'(最简单的方法是从java.util.concurrent.FutureTask中扩展或包装)。 – Barend 2012-03-31 08:26:10

1

在将CREATE,INSERT和DELETE建模为发送到命令队列的命令时,可以考虑将您的SELECT操作构建为DAO或服务类上的传统方法调用。这是一种称为Command Query Responsibility Segregation的建筑模式。

CQRS的初始复杂度比简单的“掌握DAO对象上的所有事件”命令式编程稍微高一些,但它可以提供非常难以实现的优点,特别是当命令本身存储在数据存储区中时一个附加的时尚)。其中之一就是可以随时查看数据的状态。

+0

+1:尼斯模式 – Cratylus 2012-03-31 08:27:15