如何为CRUD操作实现命令模式

时间:2012-03-31 08:06:57

标签: java design-patterns

我有一个创建,更新,删除和选择操作的UI,所以为此我想用命令模式设计它

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
    }

    }

同样有一个更新记录命令

我的问题是,如果Select操作从数据库返回一个ArrayList,我如何处理这个?

另外请分享您对此设计的想法,因为我是Designing Software的新手。

2 个答案:

答案 0 :(得分:1)

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

CQRS的初始复杂性略高于直接“敲击DAO对象上的所有东西”命令式编程,但它可以提供非常难以实现的优点,尤其是当命令本身存储在数据存储中时(在追加时尚)。其中之一是能够在任何时间点查看数据的状态。

答案 1 :(得分:1)

您采用正确的方法意味着您正在尝试在代码中使用设计模式 在您的情况下,您使用的是错误的模式。您应该使用DAO模式。

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

在您的情况下,您的问题是您的execute方法返回void并且您需要一个返回List的方法(额外)。

您可以为select返回List创建第二个方法并为其指定通用名称,而在其他命令中只需抛出UnsupportedMethod异常

E.g。

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