2012-03-31 68 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