我有一个创建,更新,删除和选择操作的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的新手。
答案 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();
}