2011-12-19 31 views
1

我正在嘗試爲我的程序的控制器組件實現策略模式。如何在控制器中實現策略模式

我有不同的視圖狀態,例如CreateViewState,您可以在其中創建項目,因此它需要像createInput()addToModel()stuff這樣的方法。

我擁有的另一個狀態是EditViewState,您可以在其中編輯以前添加的項目。您選擇一個輸入,然後更改其顏色或大小或其他。使控制器需要方法是selectInputAtLocation(),或changeColor(java.awt.Color color)changeSize(int size) ...

的方式我去那是我創造出了像repOK()的常用方法的一個IController接口,toString()和一對夫婦更喜歡thisWasTheLocation( int x,int y)視圖靜態調用以將屏幕上按下的位置傳遞給控制器​​。

但是,爲了完成他們的具體工作,我沒有一個共同的方法,他們有。我正考慮在接口中添加doStuff(Item item)方法,然後在那裏執行控制器邏輯,以便客戶端代碼可以在整個代碼中使用IController.getInstance().doStuff(item)。據我預測,如果我調用它們的具體方法(編輯控制器爲changeColor(),對於createController爲createInput()),我將需要投射控制器。

如果我在接口中創建doStuff()方法,那麼我需要實現大量的if語句,特別是對於editController(它有超過7-8個我沒有提到的方法)。

應該怎樣去設計這個整個系統呢?

P.S:Controllers是單身因此getInstance()

+0

我開始到t ry並再次回答你的問題,但不幸的是,我必須做出太多的假設,我不知道你的課程目前正試圖教你什麼,以及你有多遠。如果您可以發佈更具體的問題,也許我可以進一步幫助。如果if語句有效,沒有什麼問題。如果您有需要發佈的工作代碼,我們可以幫助您提出改進建議。 – Brad 2011-12-19 14:01:53

回答

0

這是很難從你的描述說,但它聽起來就像你寫你自己的MVC框架。爲什麼不使用Spring,Struts或類似的?目前還不清楚你的領域模型有多複雜。

簡而言之您的問題應該怎樣去設計這整個系統呢?是由許多現有的Java MVC的使用一個可能是最好的回答構架

良好的設計鼓勵你將任何棘手的業務邏輯(doStuff())出你的控制器和到服務層。您的代碼將更容易測試,而不會與您的控制器綁定。

當你的狀態所以該控制器需要的是selectInputAtLocation(),或changeColor(java.awt.Color中的顏色)或changeSize(INT大小)...這個方法聽起來好像是你增加複雜性的地方不需要。

以Struts爲例,您的HTTP表單POST將包含用戶編輯的數據,並且您的Controller可以在ActionForm bean中使用這些數據。然後,在決定調用哪種服務方法(類似於您所詢問的戰略模式)之前,先驗證/清理此用戶數據。

關於你的位指示的設計,你可以有一個有每個領域模型類中的一個控制器類這樣

public class ThingDispatchAction extends DispatchActionSupport { 

    public ActionForward read(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) 
     // call service layer to read a Thing.java 
    } 

    public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) 
     // call service layer to update a Thing.java 
    } 

    public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) 
     // call service layer to create a new Thing.java 
    } 

    public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) 
     // call service layer to persist a Thing.java 
    } 

    public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) 
     // call service layer to delete a Thing.java 
    } 
} 

或者你可以有多個控制器類爲每個域對象,以便有在每個只有一個方法像下面

public class ThingReadAction extends ActionSupport { 

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) 
     // call service layer to read a Thing.java 
    } 
} 

public class ThingDeleteAction extends ActionSupport { 

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse resp) 
     // call service layer to delete a Thing.java 
    } 
} 

etc ... 

所選擇的MVC框架類將有配置,以確定哪些方法被調用等

+0

這是一門課的作業,所以我沒有使用任何框架,比如Spring或者Struts ..我所要做的就是爲MVC系統的控制器實現一個策略模式,它必須完成不同的任務。 – eytanfb 2011-12-19 11:50:38

+0

您應該更新您的標籤以包含「作業」,以便人們瞭解您的情況,否則我們認爲您有「真實世界」問題。 – Brad 2011-12-19 13:29:55

+0

對不起,我是新來的 – eytanfb 2011-12-19 19:18:26